рдЕрдкрдиреЗ
рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдореЗрдВ , рдореИрдВрдиреЗ ASP.NET MVC рдореЗрдВ рд▓рд┐рдЦреЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред рдпрд╣ рд▓реЗрдЦ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдореЙрдбрд▓ рдХреЗ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЗ рдкрдврд╝рдиреЗ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдп
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ ClientViewModel рдХреНрд▓рд╛рд╕ рд╣реИред
public class ClientViewModel { public int Id { get; set; } public string Name { get; set; } public string Inn { get; set; } }
ViewModel рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдПрдХреНрд╢рди рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрди рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдПрдХ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдордирд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рдЪрд╛рд░
рдореЙрдбрд▓ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ, рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрд╕реА рднреВрдорд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВред
рдирд┐рд░реНрдгрдп
рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ DenyReadRolesAttribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдПрдБред рдпрд╣ рдЙрди рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ рдЬреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИрдВред
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class DenyReadRolesAttribute : Attribute, IMetadataAware { public string Roles { get; set; } public void OnMetadataCreated(ModelMetadata metadata) { if (Roles.Split(',').Any(IsUserInRole)) metadata.Model = metadata.SimpleDisplayText = " "; } private bool IsUserInRole(string roleName) { return HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.IsInRole(roleName); } }
рдореЙрдбрд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ IMetadataAware рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ OnMetadataCreated рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрдо рд╕реЗ рдХрдо рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рд╖рд┐рджреНрдз рд╕реВрдЪреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдПрдХ рд╣реИ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдФрд░ рдЗрд╕рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ "рдкрдврд╝рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИ" рдкрд╛рда рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд╕рдордп рд╡реЗрдм рдлреЙрд░реНрдо рд╕реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдХреНрд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдкрд╛рда рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рди рдЖрдПрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ "ASP.NET MVC рдореЗрдВ рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдХрд╛ рдирд┐рд╖реЗрдз" рд▓реЗрдЦ рдореЗрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛, рд╡рд╣ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЖрдкрдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХрд╕реНрдЯрдордореЛрдбреЗрд▓рдмрд╛рдЗрдВрдбрд░ рд╡рд░реНрдЧ рдореЗрдВ BindProperty рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public class CustomModelBinder : DefaultModelBinder { protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) { var d = propertyDescriptor.Attributes.OfType<DenyReadRolesAttribute>().FirstOrDefault(); if (d != null && d.Roles.Split(',').Any(r => controllerContext.HttpContext.User.IsInRole(r))) return; base.BindProperty(controllerContext, bindingContext, propertyDescriptor); } }
рдФрд░ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ global.asax.cs рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }
рдЕрдм рдпрд╣ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ ViewModel рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХреА рдЧрдИ рд╕реВрдЪреА рдЬрд┐рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред
public class ClientViewModel { [DisplayName("")] public int Id { get; set; } [DisplayName("")] public string Name { get; set; } [DisplayName("")] [DenyReadRoles(Roles = "User")] public string Inn { get; set; } }
рдкрд░рд┐рдгрд╛рдо
рдЕрдм, рдЬрдм рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рджреГрд╢реНрдп рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЗрди рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреГрд╖реНрда рд╣реЛ рдпрд╛ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рдкреНрд░рдкрддреНрд░, рдкрд╛рда рдХреЛ рджреЗрдЦреЗрдЧрд╛ "рдкрдврд╝рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИред" рд╕рдВрдкрд╛рджрди рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рднреА рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред