CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум .NET > Форум ASP.NET

Ответ Создать новую тему
 
Старый 16.01.2012, 04:26   #1
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Подскажите пожалуйста как это реализовать если я использую Entity Framework 4.0
http://www.codeproject.com/KB/web-se...sroleauth.aspx

в частости интересует вот этот вот кусок кода
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
private void btnLogin_Click(Object sender, EventArgs e)
{
    // Initialize FormsAuthentication, for what it's worth
    FormsAuthentication.Initialize();
 
    // Create our connection and command objects
    SqlConnection conn =
     new SqlConnection("Data Source=localhost;Initial Catalog=web;");
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT roles FROM web WHERE username=@username " +
     "AND password=@password";
 
    // Fill our parameters
    cmd.Parameters.Add("@username", SqlDbType.NVarChar, 64).Value =
Username.Value;
    cmd.Parameters.Add("@password", SqlDbType.NVarChar, 128).Value =
     FormsAuthentication.HashPasswordForStoringInConfigFile(
        Password.Value, "md5"); // Or "sha1"
 
    // Execute the command
    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    if (reader.Read())
    {
     // Create a new ticket used for authentication
     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, // Ticket version
        Username.Value, // Username associated with ticket
        DateTime.Now, // Date/time issued
        DateTime.Now.AddMinutes(30), // Date/time to expire
        true, // "true" for a persistent user cookie
        reader.GetString(0), // User-data, in this case the roles
        FormsAuthentication.FormsCookiePath);// Path cookie valid for
 
     // Encrypt the cookie using the machine key for secure transport
     string hash = FormsAuthentication.Encrypt(ticket);
     HttpCookie cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName, // Name of auth cookie
        hash); // Hashed ticket
 
     // Set the cookie's expiration time to the tickets expiration time
     if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
 
     // Add the cookie to the list for outgoing response
     Response.Cookies.Add(cookie);
 
     // Redirect to requested URL, or homepage if no previous page
     // requested
     string returnUrl = Request.QueryString["ReturnUrl"];
     if (returnUrl == null) returnUrl = "/";
 
     // Don't call FormsAuthentication.RedirectFromLoginPage since it
     // could
     // replace the authentication ticket (cookie) we just added
     Response.Redirect(returnUrl);
    }
    else
    {
     // Never tell the user if just the username is password is incorrect.
     // That just gives them a place to start, once they've found one or
     // the other is correct!
     ErrorLabel = "Username / password incorrect. Please try again.";
     ErrorLabel.Visible = true;
    }
 
    reader.Close();
    conn.Close();
}
как бы это мне архитектуру не порушить?
escapade вне форума
Другие темы раздела
Помощь в создании проекта на ASP в Visual Studio, для чего нужна мастер-страница ASP NET C#
Всем Доброго Времени суток, вот начал осваивать ASP - признаться честно, пока что мало что понятно. Мне пока для своего понимания интересен один аспект. файл (.aspx) web form и файл(.master) master page. Копаюсь в студии - создал ASP.NET WEB Application - c кучей файлов и форм и создал.... Помощь в создании проекта на ASP в Visual Studio, для чего нужна мастер-страница
ASP NET C# Разделение behind кода между разными aspx страницами
Здравствуйте, есть два разных файла разметки aspx Есть один файл сs Можно как то прописать логику работы серверной части из этого одного файла на два файла разметки?. Разделение behind кода между разными aspx страницами
Старый 19.01.2012, 05:07  [ТС]   #11
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Цитата Сообщение от sau Посмотреть сообщение
Мде, тут тебе нужно будет над синхронизацией WebContextComponent-а подумать, т.к asp net сам загружает данные из кукисов и обозначает текущего пользователя, ну и берет на себя весь прочий геморой., а твой WebContextComponent об этом ничего не знает (если только где то еще нету его инициализации)
мммм...так а что делать?))) горю совсем!)

Добавлено через 8 минут
WebContextComponent это "обертка для HttpContext"

в общем я так понимаю мне нада какой нить класс создать..в котором будет
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
// Initialize FormsAuthentication, for what it's worth
    FormsAuthentication.Initialize();
// Create a new ticket used for authentication
     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1, // Ticket version
        Username.Value, // Username associated with ticket
        DateTime.Now, // Date/time issued
        DateTime.Now.AddMinutes(30), // Date/time to expire
        true, // "true" for a persistent user cookie
        reader.GetString(0), // User-data, in this case the roles
        FormsAuthentication.FormsCookiePath);// Path cookie valid for
 
     // Encrypt the cookie using the machine key for secure transport
     string hash = FormsAuthentication.Encrypt(ticket);
     HttpCookie cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName, // Name of auth cookie
        hash); // Hashed ticket
 
     // Set the cookie's expiration time to the tickets expiration time
     if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
 
     // Add the cookie to the list for outgoing response
     Response.Cookies.Add(cookie);
 
     // Redirect to requested URL, or homepage if no previous page
     // requested
     string returnUrl = Request.QueryString["ReturnUrl"];
     if (returnUrl == null) returnUrl = "/";
 
     // Don't call FormsAuthentication.RedirectFromLoginPage since it
     // could
     // replace the authentication ticket (cookie) we just added
     Response.Redirect(returnUrl);
    }
    else
    {
     // Never tell the user if just the username is password is incorrect.
     // That just gives them a place to start, once they've found one or
     // the other is correct!
     ErrorLabel = "Username / password incorrect. Please try again.";
     ErrorLabel.Visible = true;
    }
 
    reader.Close();
    conn.Close();
}
 
а при Login
Код C#
1
2
3
 
accountService.Login(tbxLoginUsername.Text, tbxLoginPassword.Text);
 
в этот самый метод Login вставить вызов метода, который выше

не?? или я не в ту степь прусь?

Добавлено через 1 минуту
Код C#
1
2
 
reader.GetString(0), // User-data, in this case the roles
а вместо этого взять роли из
Код C#
1
2
accountService.AddRole(newAccount, pubRole);
                    accountService.AddRole(newAccount, regRole);
как то так я думаю....
escapade вне форума
Старый 19.01.2012, 17:26   #12
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Тут трудно что то советовать не зная всей картины, ну тикеты (хотя там есть упрощенные функции типа SetAuthCookie) можешь сохранять при вызове метода Login (это правда будет не верным если твой класс не имеет прямого отношения к слою веб.логики), а, например, свойства :
Код C#
1
2
3
4
public Account CurrentUser
public string Username
public bool LoggedIn
 
могут возвращать данные из HttpContext.Current.User, так ты хоть пристыкуешся к стандартному механизму на котором много завязок.

Добавлено через 22 минуты
Работа с ролями у тебя реализованна в accountService-е, думаю не стоит тут что то мудрить., в любом случае перечень ролей текущего пользователя можно засунуть в Accaunt (если там еще его нету), и получать через accountService(или кэширующуй слой) по логину.
sau на форуме
Старый 19.01.2012, 17:29   #13
Alligieri
Форумчанин
Эксперт C++
 
Аватар для Alligieri
 
Регистрация: 16.03.2009
Адрес: В родном облаке:)
Сообщений: 3,358
Репутация: 1717 (1032)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0


Не по теме:
Вот и обьясните мне товарищи зачем столько рукоблудства? Есть стандартные, нормальные, при этом расширяемые средства. А не это царство велосипедов
Alligieri вне форума
Старый 19.01.2012, 17:33   #14
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Ну это царство, на случай абстракции от веб приложения, дабы можно было подменить реализацию скажем WebContextComponent на WinContextComponent (например у них есть еще толстый клиент), и работать с аутентификацией уже в win приложении.
Просто что бы грамотно вписать свой код нужно понимать всю задумку, а так имея обрывки сложно что то советовать.
sau на форуме
Старый 19.01.2012, 18:03   #15
Alligieri
Форумчанин
Эксперт C++
 
Аватар для Alligieri
 
Регистрация: 16.03.2009
Адрес: В родном облаке:)
Сообщений: 3,358
Репутация: 1717 (1032)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0


Не по теме:
sau, я ж написал выше - нормально расширяемые стандартные компоненты. а тут нагорожено вообще ни к селу ни к городу.
Alligieri вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 19.01.2012, 23:12   #16
SerЁga
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 104
Репутация: 32 (32)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Я когда делал подобную систему все это выглядело примерно так:
включаем Form authentication в web.config
Код XML
1
2
3
4
5
6
7
8
 
<authentication mode="Forms">
        <forms loginUrl="Login.aspx"></forms>
      </authentication>
      <authorization>
        <allow users="*"/>
      </authorization>
 
добавляем в КОРНЕВОЙ КАТАЛОГ страницу Login.aspx
там естественно кнопка login и ввод пароля и логина
код для Login.aspx.cs:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
protected void Page_Load(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                   
                    if (HttpContext.Current.User.IsInRole("RegisteredUser"))
                    {
                        LoginOperation.ChangeDateOfLastEnter(HttpContext.Current.User.Identity.Name);
                        Response.Redirect("~/UserPages/MainPage.aspx");
 
                    }
                    if (HttpContext.Current.User.IsInRole("Moderator") ||
                        HttpContext.Current.User.IsInRole("Administrator"))
                    {
                        LoginOperation.ChangeDateOfLastEnter(HttpContext.Current.User.Identity.Name);
                        Response.Redirect("~/Default.aspx");
                    }
 
            }
           
        }
 protected void btnLogin_Click(object sender, EventArgs e)
        {
           
                    if (Request.Cookies[".ASPXAUTH"] != null)
                    {
                        Request.Cookies.Remove(".ASPXAUTH");
                    }
                    var userComponent = new LoginControlUserComponent();//это мой класс с помощью           //которого идет работа с базой данных 
                   
                        var users = userComponent.Validate(tbxLogin.Text, tbxPassword.Text);//проверяю логин //и пароль и получаю из базы пользователя
                        if (users != null)
                        {
                            var userData = LoginOperation.ParseRoleInUser(users);
                            Response.Cookies.Add(LoginOperation.CreateHttpCookie(userData.Item2, userData.Item1));//создаю cookie в который зашиваю логин как UserName и роли .                               
                            
              }
 
public static class LoginOperation
    {
      //вырываю роли и имя пользоватяля из объекта 
      public static Tuple<string,UserEntity> ParseRoleInUser(ICollection<UserEntity> users)
       {
           if (users != null)
           {
               var roles = "";
               UserEntity user = null;
               foreach (var userEntity in users)
               {
                   user = userEntity;
                   roles += userEntity.Role.Type.ToString();
                   roles += ";";
               }
               roles=roles.TrimEnd(';');
               return new Tuple<string, UserEntity>(roles,user);
           }
           return null;
       }
   //собственно функа создания кукиса
       public static HttpCookie CreateHttpCookie(UserEntity user,string name)
       {
           var ticket = new FormsAuthenticationTicket(1, user.Login, DateTime.Now, DateTime.Now.AddMinutes(30), true, name, FormsAuthentication.FormsCookiePath);
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                            FormsAuthentication.Encrypt(ticket));
                if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
           return cookie;
       }      
    }
 
var userComponent = new LoginControlUserComponent() - объект уровня бизнес логики.
UserEntity - класс бизнес компонент(сущность).
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            if (HttpContext.Current.User!=null)
            {
                if(HttpContext.Current.User.Identity is FormsIdentity)
                {
                    var identity = HttpContext.Current.User.Identity as FormsIdentity;
                    if (identity != null)
                    {
                        var ticket = identity.Ticket;
                        var roles = ticket.UserData.Split(';');
                        HttpContext.Current.User=new GenericPrincipal(identity,roles);
 
                    }
 
                }
            }
 
        }
 
так это код в global.cs.asax ну в общем в обработчике этого события код который вытаскивает из кукиса роли и засовывает их вместе с уже созданным FormIdentity в GenericPrincipal, который потом засовываем в свойство User, текущего HttpContext.

потом можно использовать свойство User страницы для доступа к имени пользователя, ну и в общем всеми плюшками которые дает .NET в этой области.
SerЁga вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
C# .NET Как реализовать маппинг нескольких таблиц БД на один класс (Entity Framework)
как реализовать маппинг нескольких таблиц БД на один класс? Или наоборот - одну таблицу на несколько классов. По умолчанию EF отображает 1:1 как Linq2SQL, как реализовать эту фишку еще не понимаю. Не лезть же напрямую в XML? Добавлено через 1 час 5 минут upd: нашел Добавлено через 15 минут...
ellin
ADO.NET и базы данных Проблема с Entity Framework
Здравствуйте, возникла проблема с отображением связей между таблицами(визуальном) в студии используя Entity Framework, то есть они не визуально показываются а при при выборе файла, а вместо этого отображается код-разметка, и Entity не работает...Переустановлял студию - не помогает, студия 2008. На...
ansi_str
ADO.NET и базы данных SQL Server CE и Entity Framework
1. Создаю БД (.sdf). 2. Создаю Entity Data Model (.edmx). 3. Подключаюсь к БД: MilitaryDBEntities context = new MilitaryDBEntities(); Проблема в том, что программа работает только если на компьютере установлен SQL Server, а если его нет, то программа не работает. Если быть точнее, то программа...
SashaPinsk
ADO.NET и базы данных using hierarchyid in entity framework
Всвязи с тем что текущая версия Entity Framework (4.1) не поддерживает hierarchyid, так как данный тип не стандартизован, хочу предложить свой метод его использования в связке с EF. Метод разрабатывался для быстродействующего кросссубдшного решения с использование базы как пассивного хранилища по...
exe-dealer
ASP.NET MVC MVC + Entity Framework
Подскажите плз ORM, а возможно и СУБД для более комфортной работы. Планируется написание проекта ERP системы для работы с большим количеством файлов, файлы естественно хранить в базе. Не уверен, но возможно, что база будет даже не реляционной. Спасибо.
Johnny_D
Опции темы

Текущее время: 23:30. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика