Asp.Net MVC рдореЗрдВ рдХрд╕реНрдЯрдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рд╣рд╛рдп рд╣рдмрд╕рд░! рдореИрдВ ASP.NET MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдореЗрд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рд╛рде рд╣реА рдПрдХ рднреВрдорд┐рдХрд╛-рдЖрдзрд╛рд░рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдпрд╣ рдЖрд▓реЗрдЦ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП ASP.NET MVC рдХреЗ рд╡рд┐рдХрд╛рд╕ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж "рдЕрдиреБрднрд╡реА" (рдЕрдиреБрднрд╡реА) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд░рдЦреЗрдВрдЧреЗред рдЖрд▓реЛрдЪрдирд╛, рд╕реБрдЭрд╛рд╡ рдФрд░ рдкрд╕рдВрдж рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рд╕реЗ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдХрд╕реНрдЯрдо (рдХрд╕реНрдЯрдо) рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рднреВрдорд┐рдХрд╛-рдЖрдзрд╛рд░рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реЛрдЧреАред рдЗрд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рдкрд░рд┐рд╡рд░реНрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдореВрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рднреВрдорд┐рдХрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреА рд╣реИред рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдорд╛рдирдХ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдХрдоред рдпрд╣ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рд╣рдЬ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдПрдХ рдмрд┐рдЯред


рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред ASP.NET MVC рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВред


рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░рдкрддреНрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХреБрдХреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдПрдХ рдХреБрдХреА рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХреГрдд рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕реЗрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЗрдВ рдПрдХ рдлрд╝реЙрд░реНрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ Encript рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред Web.Security.FormAuthentication рд╡рд░реНрдЧред рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рдлреЙрд░реНрдореНрдпреБрдереЗрдиреЗрд╢рди рдХреНрд▓рд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рдЙрдирдХрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд░реНрд╡рд░ рдорд╢реАрди рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред рдЗрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдХреБрдХреА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдврд╝рд╛ рдпрд╛ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди Http рдЕрдиреБрд░реЛрдз HttpContext.User.Identity рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
[Serializable] //TAccount -     . //TRole -  . public abstract class AbstractIdentity<TAccount, TRole>: MarshalByRefObject, IIdentity { protected AbstractIdentity() { Id = long.MinValue; } private bool _isInitialized = false; public long Id { get; set; } public string Name { get; set; } public string AuthenticationType { get { return String.Format("CustomizeAuthentication_{0}", typeof(TAccount).Name); } } public string[] Role { get; set; } public TRole[] Roles { get; set; } public bool IsAuthenticated { get { return Id != long.MinValue; } } public bool CheckRole(TRole role) { return Role.All(r => r.Equals(role.ToString())); } public void SetAccount(TAccount account) { Id = GetId(account); Name = GetName(account); Roles = GetRole(account); Role = Roles.Select(c=>c.ToString()).ToArray(); InitializeMoreFields(account); _isInitialized = true; } protected virtual void InitializeMoreFields(TAccount account) { } protected abstract long GetId(TAccount account); protected abstract string GetName(TAccount account); protected abstract TRole[] GetRole(TAccount account); public string Serialize() { if (!_isInitialized) throw new AccountNotSetException(); using (var stream = new MemoryStream()) { var formatter = new XmlSerializer(GetType()); formatter.Serialize(stream, this); return Encoding.UTF8.GetString(stream.ToArray()); } } public static TIdenty Deserialize<TIdenty>(string value) where TIdenty : AbstractIdentity<TAccount, TRole> { using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(value))) { var formatter = new XmlSerializer(typeof(TIdenty)); return (TIdenty)formatter.Deserialize(stream); } } } 


рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдореВрд░реНрдд HTTP рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЬрд┐рд╕рдореЗрдВ рд╣рдо AuthenticateRequest рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрддреА рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рд╡рд░реНрддрдорд╛рди HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдирд╛рдХрд░ рдФрд░ рд▓рд┐рдЦрдХрд░ рдХреБрдХреА рдХреЛ рджрд╢рдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 //TIdenty -      //TAccount -     . //TRole -  . public abstract class AbstractAutentificationModule<TIdenty, TAccount, TRole> : IHttpModule where TIdenty : AbstractIdentity<TAccount, TRole> { public void Init(HttpApplication context) { context.AuthenticateRequest += OnAuthenticateRequest; } private static void OnAuthenticateRequest(object sender, EventArgs e) { var application = (HttpApplication)sender; var context = application.Context; if (context.User != null && context.User.Identity.IsAuthenticated) return; var cookieName = FormsAuthentication.FormsCookieName; var cookie = application.Request.Cookies[cookieName.ToUpper()]; if (cookie == null) return; try { var ticket = FormsAuthentication.Decrypt(cookie.Value); var identity = AbstractIdentity<TAccount, TRole>.Deserialize<TIdenty>(ticket.UserData); var principal = new GenericPrincipal(identity, identity.Role); context.User = principal; Thread.CurrentPrincipal = principal; } catch {} } public void Dispose() {} } 


рдЕрдореВрд░реНрдд рдкреНрд░рд╛рдзрд┐рдХрд╛рд░ рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдХрд┐рд╕реА рдХреБрдХреА рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 //TAccount -     . public interface IAuthorizeService<in TAccount> { void SignIn(TAccount account, bool createPersistentCookie); void SignOut(); } //TIdenty -     //TAccount -     . //TRole -  . public abstract class AbstractAuthorizeService<TIdentity, TAccount, TRole> : IAuthorizeService<TAccount> where TIdentity : AbstractIdentity<TAccount, TRole>, new() { private const int TICKET_VERSION = 1; private const int EXPIRATION_MINUTE = 60; public void SignIn(TAccount account, bool createPersistentCookie) { var accountIdentity = CreateIdentity(account); var authTicket = new FormsAuthenticationTicket(TICKET_VERSION, accountIdentity.Name, DateTime.Now, DateTime.Now.AddMinutes(EXPIRATION_MINUTE), createPersistentCookie, accountIdentity.Serialize()); CreateCookie(authTicket); HttpContext.Current.User = new GenericPrincipal(accountIdentity, accountIdentity.Role); } private TIdentity CreateIdentity(TAccount account) { var accountIdentity = new TIdentity(); accountIdentity.SetAccount(account); return accountIdentity; } private void CreateCookie(FormsAuthenticationTicket ticket) { var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)) { Expires = DateTime.Now.Add(FormsAuthentication.Timeout), }; HttpContext.Current.Response.Cookies.Add(authCookie); } public void SignOut() { FormsAuthentication.SignOut(); } } 


рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЪреВрдБрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рдпрдореЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ (RuleFactory) рдореЗрдВ рд╕реМрдВрдкрддреЗ рд╣реИрдВред
IRule рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public interface IRule { bool Check(IIdentity user); } //     //TIdenty -     //TAccount -     . //TRole -  . internal class Rule<TIdentity, TAccount, TRole> : IRule where TIdentity : AbstractIdentity<TAccount, TRole> { private readonly Func<TIdentity, bool> _check; public Rule(Func<TIdentity, bool> check) { if (check == null) throw new ArgumentNullException("check"); _check = check; } public bool Check (IIdentity user) { return _check((TIdentity) user); } } //  //TIdenty -     //TAccount -     . //TRole -  . public class RuleFactory<TIdentity, TAccount, TRole> where TIdentity : AbstractIdentity<TAccount, TRole> { public IRule Create(Func<TIdentity, bool> rule) { return new Rule<TIdentity, TAccount, TRole> (rule); } } //  public abstract class AbstractAutintificateAttribute : AuthorizeAttribute { private readonly ICollection<IRule> _rules = new List<IRule> (); private readonly bool _isNotSimpleAuthentication; protected AbstractAutintificateAttribute(bool isNotSimpleAuthentication) { _isNotSimpleAuthentication = isNotSimpleAuthentication; } protected void AddRule(IRule rule) { if (rule == null) throw new ArgumentNullException ("rule"); _rules.Add (rule); } protected override bool AuthorizeCore(HttpContextBase httpContext) { if (httpContext == null) throw new ArgumentNullException("httpContext"); if (httpContext.User == null || !httpContext.User.Identity.IsAuthenticated) return false; var isAuthorize = false; isAuthorize |= _rules.Any(rule => rule.Check(httpContext.User.Identity)); isAuthorize |= httpContext.Request.IsAuthenticated && !_isNotSimpleAuthentication; return isAuthorize; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { var context = filterContext.HttpContext; var appPath = context.Request.ApplicationPath == "/" ? string.Empty : context.Request.ApplicationPath; var loginUrl = FormsAuthentication.LoginUrl; var path = HttpUtility.UrlEncode(context.Request.Url.PathAndQuery); var url = String.Format("{0}{1}?ReturnUrl={2}", appPath, loginUrl, path); if (!filterContext.IsChildAction) filterContext.Result = new RedirectResult(url); } } 


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдореВрд▓ рд╕рд╛рд░ рдирд┐рдпрдВрддреНрд░рдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 //TIdenty -     //TAccount -     . //TRole -  . public abstract class AbstractController<TIdenty, TAccount, TRole> : Controller where TIdenty : AbstractIdentity<TAccount, TRole> { protected AbstractController() { _user = new Lazy<TIdenty>(() => HttpContext.User.Identity as TIdenty); } private readonly Lazy<TIdenty> _user; protected TIdenty CurrentUser { get { return _user.Value; } } } 


рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред
рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рд╣реИ рдкрд╣рдЪрд╛рди рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public class ExampleIdentity : AbstractIdentity<Account, Role> { public string Email { get; set; } //  .     protected override long GetId(Account account) { return account.Id; } //  .   () protected override string GetName(Account account) { return account.Login; } //  .     protected override Role[] GetRole(Account account) { return new []{ account.Role }; } // .        .     protected override void InitializeMoreFields(Account account) { Email = account.Email; } } 


рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЙрдбреНрдпреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public class ExampleAutintificateModule : AbstractAutentificationModule<ExampleIdentity, Account, Role> { } 

рдЕрдкрдиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЛ Web.config рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЕрд╡рд┐рд╕реНрдорд░рдгреАрдп рд╣реИ, рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдмрджрд▓рдирд╛ рд╣реИред
 <?xml version="1.0" encoding="utf-8"?> <configuration> .... <system.web> .... <httpModules> <remove name="FormsAuthentication" /> <add name="FormsAuthentication" type="Example.Infrostructure.ExampleAutintificateModule" /> </httpModules> <authentication mode="Forms"> <!--loginUrl     --> <forms loginUrl="~/User/Login" timeout="2880" /> </authentication> </system.web> </configuration> <system.webServer> .... <modules runAllManagedModulesForAllRequests="true"> <remove name="FormsAuthentication" /> <add name="FormsAuthentication" type="Example.Infrostructure.ExampleAutintificateModule" /> </modules> </system.webServer> 


рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public class ExampleAuthorizeService : AbstractAuthorizeService<ExampleIdentity, Account, Role> { } 


рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдВрддреНрд░рдХ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public abstract class ExampleController : AbstractController<ExampleIdentity, Account, Role> { } 


рдЦреИрд░, рд╣рдо рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 //  public class ExampleRuleFactory : RuleFactory<ExampleIdentity, Account, Role> { } //     . public class ExampleAuthintificationAtribute : AbstractAutintificateAttribute { private readonly ExampleRuleFactory _ruleFactory = new ExampleRuleFactory(); public ExampleAuthintificationAtribute(params Role[] allowedRole) : base(allowedRole.Any()) { //    ,        AddRule(_ruleFactory.Create(account => allowedRole.Intersect(account.Roles).Any())); //  ,      AddRule(_ruleFactory.Create(account => account.Roles.Any(c=>c == Role.Admin))); } } 


рдирд┐рд╖реНрдХрд░реНрд╖


рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдиреМрдЧрдЯ-рдкреИрдХреЗрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИ, рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 Install-Package MvcCustomizableFormAuthentication 

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдЬреАрдердм рдкрд░ рд╣реИ, рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕рд▓рд╛рд╣, рдЖрд▓реЛрдЪрдирд╛, рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВред
рдкреБрдирд╢реНрдЪ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╡рд┐рд╕реНрдорд░рдгреАрдпред

Source: https://habr.com/ru/post/In174097/


All Articles