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 страницами
Старый 17.01.2012, 00:08   #2
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

как бы это мне архитектуру не порушить
- ничего не трогать и даже не дышать ), а вообще насколько мне известно FormsAuthentication не менялся со времен 2-й версии. (а может и первой), твой пример будет работать и на версии 1.
Или ты хочешь RoleManager-а сюда прикрутить ?
sau на форуме
Старый 17.01.2012, 16:44  [ТС]   #3
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

мне нужна аутентификация на основе Forms, поддержка ролей пользователей, без использования Membership и стандартной базы данных membership.
escapade вне форума
Старый 17.01.2012, 17:09   #4
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Ну так в чем проблема тогда ? - делай как в примере
sau на форуме
Старый 18.01.2012, 00:03  [ТС]   #5
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

ну я не очень понимаю куда я должен вставить код генерации кукиса...при регистрации?
escapade вне форума
Старый 18.01.2012, 14:10   #6
Alligieri
Форумчанин
Эксперт C++
 
Аватар для Alligieri
 
Регистрация: 16.03.2009
Адрес: В родном облаке:)
Сообщений: 3,358
Репутация: 1717 (1032)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Цитата Сообщение от escapade Посмотреть сообщение
ну я не очень понимаю куда я должен вставить код генерации кукиса...при регистрации?
ну как куда - тут же ясно видно
Цитата Сообщение от escapade Посмотреть сообщение
// Add the cookie to the list for outgoing response
Response.Cookies.Add(cookie);
Прикрепляете к ответу сервера

Добавлено через 1 минуту
Вообще не сильно понимаю при чем здесь EF к кукисам?! Своим уровнем доступа к данным вы просто заеняете все части в примере которые используют Sql-провайдер напрямую, вот и все
Alligieri вне форума
Старый 19.01.2012, 03:12  [ТС]   #7
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

моя страница Login
Код 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BusinessLogic;
using Components;
 
namespace Web.Account
{
    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
 
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            var accountService = new AccountService();
            accountService.Login(tbxLoginUsername.Text, tbxLoginPassword.Text);
            
        }
    }
}

мой accounService
Код 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using BusinessLogic.Interfaces;
using Common;
using Components;
using DataAccessLayer;
using DataAccessLayer.Repositories;
 
namespace BusinessLogic
{
    public class AccountService:IAccountService
 
    {
        private AccountRepository accountRepository=new AccountRepository();
        private UserSessionComponent userSession=new UserSessionComponent();
        private RedirectorComponent redirector=new RedirectorComponent();
        private EmailComponent _email=new EmailComponent();
        private LoggerComponent log=new LoggerComponent();
 
        //CHAPTER 5
        public List<Account> SearchAccounts(string searchText)
        {
            return accountRepository.SearchAccounts(searchText);
        }
        public bool UsernameInUse(string username)
        {
            try
            {
                var account = accountRepository.GetAccountByUsername(username);
                return account != null;
            }
            catch (Exception e)
            {
                log.Error(e, e.Message);
                return false;
            }
        }
 
        public bool EmailInUse(string email)
        {
            try
            {
                var account = accountRepository.GetAccountByEmail(email);
                return account != null;
            }
            catch (Exception e)
            {
                log.Error(this, e.Message);
                return false;
            }
        }
 
        public void Logout()
        {
            try
            {
                userSession.LoggedIn = false;
                userSession.CurrentUser = null;
                userSession.Username = string.Empty;
                redirector.GoToAccountLoginPage();
            }
            catch (Exception e)
            {
                log.Error(this, e.Message);
            }
        }
 
        public string Login(string username, string password)
        {
            try
            {
                password = password.Encrypt(username);
                var account = accountRepository.GetAccountByUsername(username);
 
                if (account != null)
                {
                    //password matches
                    if (account.Password == password)
                    {
                        userSession.LoggedIn = true;
                        userSession.Username = username;
                        userSession.CurrentUser = account;
                        redirector.GoToProfilesDefault();
                        
                    }
                }
                return "Check your Username and try again!";
            }
            catch (Exception e)
            {
                log.Error(e, e.Message);
                return e.Message;
            }
        }
 
        public void SaveAccount(Account account)
        {
            accountRepository.SaveAccount(account);
        }
 
        public Account GetAccountByEmail(string email)
        {
            return accountRepository.GetAccountByEmail(email);
        }
 
        public void AddRole(Account account, Role role)
        {
            accountRepository.AddRole(account, role);
        }
 
        //Chapter 4
        public Account GetAccountById(int accountId)
        {
            return accountRepository.GetAccountById(accountId);
        }
 
        public Account GetAccountByUsername(string username)
        {
            return accountRepository.GetAccountByUsername(username);
        }
    }
}
AccountRepository
Код 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Linq;
using DataAccessLayer.Interfaces;
 
namespace DataAccessLayer.Repositories
{
    public class AccountRepository:IAccountRepository 
    {
        private Connection conn;
        public AccountRepository(){conn=new Connection();}
        public Account GetAccountById(int accountId)
        {
            Account account;
            using (SNDataContext dc = conn.GetContext())
            {
                account = (dc.Account.Where(a => a.AccountID == accountId)).FirstOrDefault();
            }
            return account;
        }
        public Account GetAccountByEmail(string email)
        {
            Account account;
            using (SNDataContext dc = conn.GetContext())
            {
                account = (from a in dc.Account
                           where a.Email == email
                           select a).FirstOrDefault();
            }
            return account;
        }
        public Account GetAccountByUsername(string username)
        {
            Account account;
            using (SNDataContext dc=conn.GetContext())
            {
                account = (from a in dc.Account
                           where a.Username == username
                           select a).FirstOrDefault();
            }
            return account;
        }
        public void AddRole(Account account, Role role)
        {
            using (SNDataContext dc=conn.GetContext())
            {
                var ar = new AccountRole {AccountID = account.AccountID, RoleID = role.RoleID};
                dc.AccountRole.AddObject(ar);
                dc.SaveChanges();
            }
        }
        public void SaveAccount(Account account)
        {
            using (SNDataContext dc = conn.GetContext())
            {
                if (account.AccountID > 0)
                {
                    dc.Account.Attach(new Account { AccountID = account.AccountID });
                    dc.Account.ApplyCurrentValues(account);
                }
                else
                {
                    dc.Account.AddObject(account);
                }
                dc.SaveChanges();
            }
            {
                
            }
        }
        public void DeleteAccount(Account account)
        {
            using (SNDataContext dc = conn.GetContext())
            {
                dc.Account.DeleteObject(account);
                dc.SaveChanges();
            }
        }
        public List<Account> GetAllAccounts(int pageNumber)
        {
            IEnumerable<Account> accounts;
            using (SNDataContext dc = conn.GetContext())
            {
                accounts = (from a in dc.Account
                            orderby a.Username
                            select a).Skip((pageNumber - 1)*10).Take(10);
            }
            return accounts.ToList();
        }
        //CHAPTER 5
        public List<Account> SearchAccounts(string searchText)
        {
            var result = new List<Account>();
            using (var dc = conn.GetContext())
            {
                IEnumerable<Account> accounts = from a in dc.Account
                                                where (a.FirstName + " " + a.LastName).Contains(searchText) ||
                                                    a.Email.Contains(searchText) ||
                                                    a.Username.Contains(searchText)
                                                select a;
                result = accounts.ToList();
            }
            return result;
        }
         
    }
}
так вот сопсна вопрос..куда вставить этот кусок кода?)
escapade вне форума
Старый 19.01.2012, 03:26   #8
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

Ну у тебя ,судя по всему, уже своя логика реализована, зачем тебе еще что то делать ?
UserSessionComponent видать делает всю грязную работу.
sau на форуме
Старый 19.01.2012, 03:42  [ТС]   #9
escapade
Новичок
 
Регистрация: 19.09.2011
Сообщений: 58
Репутация: 0 (0)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

да но он куки не генерирует...вот....я поэтому и думаю куда этот кусок кода запихнуть что б все как по науке работало)

Добавлено через 1 минуту
Код 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
using DataAccessLayer;
using Interfaces;
 
namespace Components
{
    
    public class UserSessionComponent:IUserSessionComponent
    {
        
        private WebContextComponent _webContextComponent=new WebContextComponent(); 
 
        public bool LoggedIn
        {
            get
            {
                return _webContextComponent.LoggedIn;
            }
            set
            {
                _webContextComponent.LoggedIn = value;
            }
        }
 
        public Account CurrentUser
        {
            get
            {
                return _webContextComponent.CurrentUser;
            }
            set
            {
                _webContextComponent.CurrentUser = value;
            }
        }
 
        public string Username
        {
            get
            {
                return _webContextComponent.Username;
            }
 
            set
            {
                _webContextComponent.Username = value;
            }
        }
    }
}


Код 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Web;
using DataAccessLayer;
using Interfaces;
 
namespace Components
{
    public class WebContextComponent : IWebContextComponent 
    {
        //CHAPTER 5
        public int AccoundIdToInvite
        {
            get
            {
                int result = !string.IsNullOrEmpty(GetQueryStringValue("AccountIdToInvite")) ? Convert.ToInt32(GetQueryStringValue("AccountIdToInvite")) : 0;
                return result;
            }
        }
 
        //CHAPTER 5
        public string SearchText
        {
            get
            {
                string result = !string.IsNullOrEmpty(GetQueryStringValue("s")) ? GetQueryStringValue("s") : "";
                return result;
            }
        }
        public int AccountId
        {
            get
            {
                if (!string.IsNullOrEmpty(GetQueryStringValue("AccountID")))
                {
                    return Convert.ToInt32(GetQueryStringValue("AccountID"));
                }
                return 0;
            }
        }
        //CHAPTER 3
        public Account CurrentUser
        {
            get
            {
                if (ContainsInSession("CurrentUser"))
                {
                    return GetFromSession("CurrentUser") as Account;
                }
 
                return null;
            }
            set
            {
                SetInSession("CurrentUser", value);
            }
        }
 
        //CHAPTER 3
        public string Username
        {
            get
            {
                if (ContainsInSession("Username"))
                {
                    return GetFromSession("Username").ToString();
                }
 
                return "";
            }
 
            set
            {
                SetInSession("Username", value);
            }
        }
 
        //CHAPTER 3
        public bool LoggedIn
        {
            get
            {
                if (ContainsInSession("LoggedIn"))
                {
                    if ((bool)GetFromSession("LoggedIn"))
                        return true;
                    return false;
                }
                return false;
            }
            set
            {
                SetInSession("LoggedIn", value);
            }
        }
 
        //CHAPTER 3
        public string UsernameToVerify
        {
            get
            {
                return GetQueryStringValue("a");
            }
        }
 
        public void ClearSession()
        {
            HttpContext.Current.Session.Clear();
        }
 
        public bool ContainsInSession(string key)
        {
            return HttpContext.Current.Session[key] != null;
        }
 
        public void RemoveFromSession(string key)
        {
            HttpContext.Current.Session.Remove(key);
        }
 
        private string GetQueryStringValue(string key)
        {
            return HttpContext.Current.Request.QueryString.Get(key);
        }
 
        private void SetInSession(string key, object value)
        {
            if (HttpContext.Current == null || HttpContext.Current.Session == null)
            {
                return;
            }
            HttpContext.Current.Session[key] = value;
        }
 
        private object GetFromSession(string key)
        {
            if (HttpContext.Current == null || HttpContext.Current.Session == null)
            {
                return null;
            }
            return HttpContext.Current.Session[key];
        }
 
        private void UpdateInSession(string key, object value)
        {
            HttpContext.Current.Session[key] = value;
        }
    }
}
escapade вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 19.01.2012, 04:20   #10
sau
Форумчанин
 
Аватар для sau
 
Регистрация: 22.07.2011
Адрес: Москва
Сообщений: 1,259
Репутация: 637 (507)
По умолчанию Re: Formsroleauth: как это реализовать если я использую Entity Framework 4.0

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

Похожие темы
Тема Автор
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:32. Часовой пояс GMT +4.

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