рдкрд╛рда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп : рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдорд╛рдирдХ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдХреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐ рд╕реАрдЦрдирд╛ред IPrincipal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореЙрдбреНрдпреВрд▓ (IHttpModule) рдФрд░ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ IActionFilter рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдПрдВред
рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, asp.net mvc рдореЗрдВ, рд╕рднреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ AspNetMembershipProvider рдирд╛рдордХ рдПрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд┐рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ http://habrahabr.ru/post/142711/ (рдЕрдм рдпрд╣ рдмрдВрдж рд╣реИ) рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдпрд╣ "рдзрдХреНрдХрд╛ рдФрд░ рдХреНрдпрд╛ рдЕрдВрджрд░ рд╣реИ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛" рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╣реИред рдЬрдм рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ asp.net mvc рд╕реЗ рдорд┐рд▓рд╛, рддреЛ рдЗрд╕рдиреЗ рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ http://habrahabr.ru/post/143024/ - рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдпрд╣рд╛рдВ, рд╣рдо рдмрд▓реНрдХрд┐ asp.net mvc рдорд╛рдирдХ рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрдЦреНрдп рдкрд╛рдареЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИредрдХреБрдХреАрдЬрд╝
рдХреБрдХреА рдПрдХ рд╕рд░реНрд╡рд░ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рднреЗрдЬреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рддреНрдпреЗрдХ (рд▓рдЧрднрдЧ рд╣рд░) рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИрдбрд░ рдореЗрдВ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддрд╛ рд╣реИ:
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Set-Cookie: name2=value2; Expires=Wed, 09-Jun-2021 10:18:14 GMT
рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдпрджрд┐ рдХреБрдХреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИ):
GET /spec.html HTTP/1.1 Host: www.example.org Cookie: name=value; name2=value2 Accept: *
рдХреБрдХреА рд╕реЗрдЯ рдХрд░реЗрдВ (/Areas/Default/Controllers/HomeController.cs):
public ActionResult Index() { var cookie = new HttpCookie() { Name ="test_cookie", Value = DateTime.Now.ToString("dd.MM.yyyy"), Expires = DateTime.Now.AddMinutes(10), }; Response.SetCookie(cookie); return View(); }
Chrome рдореЗрдВ, рд╣рдо рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
рдХреБрдХреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
var cookie = Request.Cookies["test_cookie"];
рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ:
рдиреЛрдЯ: рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдкрд░ рдХреБрдХреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:
http://www.nczonline.net/blog/2009/05/05/http-cookies-explained/
рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреБрдХреАрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд╡рдзрд╛рдиреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ:
- FormsAuthenticationTicket - рд╣рдо рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░реВрдк рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
- рдЖрдкрдХреЛ IPrincipal рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░
HttpContext.User
рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ IIdentity
рдЬрд╛рдБрдЪ рдХрд░рдиреЗ IIdentity
рд╣реИред - IIdentity рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░реЗрдВ
- рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рди рдореЗрдВ BaseController рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
IAuthentication рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЙрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди CustomAuthentication (/Global/Auth/IAuthentication.cs) рдмрдирд╛рдПрдБ:
public interface IAuthentication {
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (/Global/Auth/CustomAuthentication.cs):
public class CustomAuthentication : IAuthentication { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private const string cookieName = "__AUTH_COOKIE"; public HttpContext HttpContext { get; set; } [Inject] public IRepository Repository { get; set; } #region IAuthentication Members public User Login(string userName, string Password, bool isPersistent) { User retUser = Repository.Login(userName, Password); if (retUser != null) { CreateCookie(userName, isPersistent); } return retUser; } public User Login(string userName) { User retUser = Repository.Users.FirstOrDefault(p => string.Compare(p.Email, userName, true) == 0); if (retUser != null) { CreateCookie(userName); } return retUser; } private void CreateCookie(string userName, bool isPersistent = false) { var ticket = new FormsAuthenticationTicket( 1, userName, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), isPersistent, string.Empty, FormsAuthentication.FormsCookiePath); // Encrypt the ticket. var encTicket = FormsAuthentication.Encrypt(ticket); // Create the cookie. var AuthCookie = new HttpCookie(cookieName) { Value = encTicket, Expires = DateTime.Now.Add(FormsAuthentication.Timeout) }; HttpContext.Response.Cookies.Set(AuthCookie); } public void LogOut() { var httpCookie = HttpContext.Response.Cookies[cookieName]; if (httpCookie != null) { httpCookie.Value = string.Empty; } } private IPrincipal _currentUser; public IPrincipal CurrentUser { get { if (_currentUser == null) { try { HttpCookie authCookie = HttpContext.Request.Cookies.Get(cookieName); if (authCookie != null && !string.IsNullOrEmpty(authCookie.Value)) { var ticket = FormsAuthentication.Decrypt(authCookie.Value); _currentUser = new UserProvider(ticket.Name, Repository); } else { _currentUser = new UserProvider(null, null); } } catch (Exception ex) { logger.Error("Failed authentication: " + ex.Message); _currentUser = new UserProvider(null, null); } } return _currentUser; } } #endregion }
рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо
HttpContext.Request.Cookies
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░
UserProvider
рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ:
var ticket = FormsAuthentication.Decrypt(authCookie.Value); _currentUser = new UserProvider(ticket.Name, Repository);
IRepository рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ IRepository.Login рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИред SqlRepository рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
public User Login(string email, string password) { return Db.Users.FirstOrDefault(p => string.Compare(p.Email, email, true) == 0 && p.Password == password); }
UserProvider, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, IPrincipal рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рднреВрдорд┐рдХрд╛ рдЬрд╛рдБрдЪ рдФрд░ IIdentity рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ)ред
UserProvider рд╡рд░реНрдЧ (/Global/Auth/UserProvider.cs) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
public class UserProvider : IPrincipal { private UserIndentity userIdentity { get; set; } #region IPrincipal Members public IIdentity Identity { get { return userIdentity; } } public bool IsInRole(string role) { if (userIdentity.User == null) { return false; } return userIdentity.User.InRoles(role); } #endregion public UserProvider(string name, IRepository repository) { userIdentity = new UserIndentity(); userIdentity.Init(name, repository); } public override string ToString() { return userIdentity.Name; }
рд╣рдорд╛рд░рд╛
UserProvider
рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА
IIdentity
рд╡рд░реНрдЧ
UserIdentity
, рдФрд░ рдЗрд╕рд▓рд┐рдП
User
рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо
InRoles(role)
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
public bool InRoles(string roles) { if (string.IsNullOrWhiteSpace(roles)) { return false; } var rolesArray = roles.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (var role in rolesArray) { var hasRole = UserRoles.Any(p => string.Compare(p.Role.Code, role, true) == 0); if (hasRole) { return true; } } return false; }
InRoles
рд╡рд┐рдзрд┐ рдореЗрдВ
InRoles
рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдЖрдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ, рдореЙрдбрд░реЗрдЯрд░, рд╕рдВрдкрд╛рджрдХ", рдпрджрд┐ рднреВрдорд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣рдорд╛рд░реЗ
User
, рддреЛ рд╣рдо рдЧрд░реНрднрд╛рдзрд╛рди "рд╕рдЪреНрдЪрд╛" (рд╡рд╣рд╛рдБ рдкрд╣реБрдВрдЪ) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдХреНрд╖реЗрддреНрд░ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░реЗрдВред рднреВрдорд┐рдХрд╛, рднреВрдорд┐рдХрд╛ рдирд╣реАрдВред рдирд╛рдоред
UserIdentity class (/Global/Auth/UserIdentity.cs) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
public class UserIndentity : IIdentity { public User User { get; set; } public string AuthenticationType { get { return typeof(User).ToString(); } } public bool IsAuthenticated { get { return User != null; } } public string Name { get { if (User != null) { return User.Email; }
IRepository
рдирдпрд╛
GetUser(email)
рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред
SqlRepository.GetUser()
(LessonProject.Model: /SqlRepository/User.cs) рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
public User GetUser(string email) { return Db.Users.FirstOrDefault(p => string.Compare(p.Email, email, true) == 0); }
рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдмреЗрд╕рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдВрдЯ:
[Inject] public IAuthentication Auth { get; set; } public User CurrentUser { get { return ((UserIndentity)Auth.CurrentUser.Identity).User; } }
рд╣рд╛рдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдордЬрдмреВрдд рдмрдВрдзрди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
IUserProvider
рдкреЗрд╢
IUserProvider
, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХреГрдд
User
рдХреА рд╡рд╛рдкрд╕реА рдХреА рдорд╛рдВрдЧ рдХрд░реЗрдВрдЧреЗ:
public interface IUserProvider { User User { get; set; } } тАж public class UserIndentity : IIdentity, IUserProvider {
рдЪрд▓рд┐рдП рдЕрдм рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ IAuthentication + CustomAuthentication рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП Ninject (/App_Start/NinjectWebCommon.cs) рдЬреЛрдбрд╝реЗрдВ:
kernel.Bind<IAuthentication>().To<CustomAuthentication>().InRequestScope();
рдлрд┐рд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдЬреЛ AuthenticateRequest рдШрдЯрдирд╛ рдкрд░ рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реЗрдЧрд╛:
public class AuthHttpModule : IHttpModule { public void Init(HttpApplication context) { context.AuthenticateRequest += new EventHandler(this.Authenticate); } private void Authenticate(Object source, EventArgs e) { HttpApplication app = (HttpApplication)source; HttpContext context = app.Context; var auth = DependencyResolver.Current.GetService<IAuthentication>(); auth.HttpContext = context; context.User = auth.CurrentUser; } public void Dispose() { } }
рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рднреА рдирдордХ:
auth.HttpContext = context context.User = auth.CurrentUser
ред рдЬреИрд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрджрд░реНрдн рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдХреБрдХреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рддреБрд░рдВрдд рдирд╛рдо рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреЗрд╕рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдорд╛рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред
рд╣рдо Web.config рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
<system.web> тАж <httpModules> <add name="AuthHttpModule" type="LessonProject.Global.Auth.AuthHttpModule"/> </httpModules> </system.web>
рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд╢реАрд░реНрд╖ рдкрд░ рд╣рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЕрдзрд┐рдХреГрдд рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдИрдореЗрд▓ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд▓рд┐рдВрдХ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд▓реЙрдЧрд┐рди рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ
- рдПрдХ рд▓реЙрдЧрд┐рди рдлрд╝реЙрд░реНрдо рдмрдирд╛рдПрдБ
- рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдбреЗрдЯрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ рдЕрдзрд┐рдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ
- рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдорд╛рд░ рджреЗрдВ
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред
Html.Action(тАЬUserLoginтАЭ, тАЬHomeтАЭ)
- рдпрд╣ рдПрдХ рдЖрдВрд╢рд┐рдХ рджреГрд╢реНрдп рд╣реИ (рдпрд╛рдиреА рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдирд╣реАрдВ рд╣реИ) - i.e. рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдФрд░ рд░реЗрдВрдбрд░рдмреЙрдбреА () рдореЗрдВ рдирд╣реАрдВред
_Layout.cshtml (/Areas/Default/Views/Saring/_Layout.cshtml):
<body> <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <ul class="nav nav-pills pull-right"> @Html.Action("UserLogin", "Home") </ul> </div> </div> </div> @RenderBody() HomeController.cs: public ActionResult UserLogin() { return View(CurrentUser); }
UserLogin.cshtml (/Areas/Default/Views/Home/UserLogin.cshtml):
@model LessonProject.Model.User @if (Model != null) { <li>@Model.Email</li> <li>@Html.ActionLink("", "Logout", "Login")</li> } else { <li>@Html.ActionLink("", "Index", "Login")</li> <li>@Html.ActionLink("", "Register", "User")</li> }
LoginController рдирд┐рдХрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХ (/Areas/Default/Controllers/LoginController.cs):
public class LoginController : DefaultController { [HttpGet] public ActionResult Index() { return View(new LoginView()); } [HttpPost] public ActionResult Index(LoginView loginView) { if (ModelState.IsValid) { var user = Auth.Login(loginView.Email, loginView.Password, loginView.IsPersistent); if (user != null) { return RedirectToAction("Index", "Home"); } ModelState["Password"].Errors.Add(" "); } return View(loginView); } public ActionResult Logout() { Auth.LogOut(); return RedirectToAction("Index", "Home"); } }
LoginView.cs (/Models/ViewModels/LoginView.cs):
public class LoginView { [Required(ErrorMessage = " email")] public string Email { get; set; } [Required(ErrorMessage = " ")] public string Password { get; set; } public bool IsPersistent { get; set; } }
рд▓реЙрдЧрд┐рди рдкреЗрдЬ Index.cshtml (/Areas/Default/Views/Index.cshtml):
@model LessonProject.Models.ViewModels.LoginView @{ ViewBag.Title = ""; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } <h2></h2> @using (Html.BeginForm("Index", "Login", FormMethod.Post, new { @class = "form-horizontal" })) { <fieldset> <legend></legend> <div class="control-group"> <label class="control-label" for="Email"> Email</label> <div class="controls"> @Html.TextBox("Email", Model.Email, new { @class = "input-xlarge" }) <p class="help-block"> Email</p> @Html.ValidationMessage("Email") </div> </div> <div class="control-group"> <label class="control-label" for="Password"> </label> <div class="controls"> @Html.Password("Password", Model.Password, new { @class = "input-xlarge" }) @Html.ValidationMessage("Password") </div> </div> <div class="form-actions"> <button type="submit" class="btn btn-primary"> </button> </div> </fieldset> }
рдЪрд▓рд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ:
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж:
рд╕рднреА рд╕реНрд░реЛрдд
https://bitbucket.org/chernikov/lessons рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ