现在我装饰一个这样的方法,让"成员"访问我的控制器动作
[Authorize(Roles="members")]
如何允许多个角色?例如,以下内容不起作用,但它显示了我要做的事情(允许"成员"和"管理员"访问):
[Authorize(Roles="members", "admin")]
小智.. 565
另一种选择是在发布时使用单个授权过滤器,但删除内部引用.
[Authorize(Roles="members, admin")]
也适用于MVC 5.+1 (5认同)
适用于ASP.NET Core 1.0(MVC 6)和Microsoft.AspNet.Identity v3.* (4认同)
适用于MVC3和MVC4 +1 (3认同)
如果您只有一个需要授权的控制器,这是可以的.如果你有多个,你就是复制那些字符串常量(yuck).我更喜欢具有角色名称的静态类.我的宠物讨厌是重复的字符串......太糟糕了. (3认同)
Pablo Claus.. 119
如果要使用自定义角色,可以执行以下操作:
CustomRoles
类:
public static class CustomRoles { public const string Administrator = "Administrador"; public const string User = "Usuario"; }
用法
[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]
如果您的角色很少,也许您可以将它们组合起来(为了清晰起见),如下所示:
public static class CustomRoles { public const string Administrator = "Administrador"; public const string User = "Usuario"; public const string AdministratorOrUser = Administrator + "," + User; }
用法
[Authorize(Roles = CustomRoles.AdministratorOrUser)]
如果您向不知道CustomRoles背后的人解释,这将是一个很好的答案. (7认同)
Mihkel Müür.. 78
一种可能的简化是子类AuthorizeAttribute
:
public class RolesAttribute : AuthorizeAttribute { public RolesAttribute(params string[] roles) { Roles = String.Join(",", roles); } }
用法:
[Roles("members", "admin")]
在语义上它与Jim Schmehil的答案相同.
另一种选择是在发布时使用单个授权过滤器,但删除内部引用.
[Authorize(Roles="members, admin")]
如果要使用自定义角色,可以执行以下操作:
CustomRoles
类:
public static class CustomRoles { public const string Administrator = "Administrador"; public const string User = "Usuario"; }
用法
[Authorize(Roles = CustomRoles.Administrator +","+ CustomRoles.User)]
如果您的角色很少,也许您可以将它们组合起来(为了清晰起见),如下所示:
public static class CustomRoles { public const string Administrator = "Administrador"; public const string User = "Usuario"; public const string AdministratorOrUser = Administrator + "," + User; }
用法
[Authorize(Roles = CustomRoles.AdministratorOrUser)]
一种可能的简化是子类AuthorizeAttribute
:
public class RolesAttribute : AuthorizeAttribute { public RolesAttribute(params string[] roles) { Roles = String.Join(",", roles); } }
用法:
[Roles("members", "admin")]
在语义上它与Jim Schmehil的答案相同.
对于MVC4,使用带有我的角色的Enum
(UserRoles
),我使用自定义AuthorizeAttribute
.
在我的控制行动中,我这样做:
[CustomAuthorize(UserRoles.Admin, UserRoles.User)] public ActionResult ChangePassword() { return View(); }
我使用这样的习惯AuthorizeAttribute
:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] public class CustomAuthorize : AuthorizeAttribute { private string[] UserProfilesRequired { get; set; } public CustomAuthorize(params object[] userProfilesRequired) { if (userProfilesRequired.Any(p => p.GetType().BaseType != typeof(Enum))) throw new ArgumentException("userProfilesRequired"); this.UserProfilesRequired = userProfilesRequired.Select(p => Enum.GetName(p.GetType(), p)).ToArray(); } public override void OnAuthorization(AuthorizationContext context) { bool authorized = false; foreach (var role in this.UserProfilesRequired) if (HttpContext.Current.User.IsInRole(role)) { authorized = true; break; } if (!authorized) { var url = new UrlHelper(context.RequestContext); var logonUrl = url.Action("Http", "Error", new { Id = 401, Area = "" }); context.Result = new RedirectResult(logonUrl); return; } } }
这是FabricioMartínezTamayo修改过的FNHMVC的一部分https://github.com/fabriciomrtnz/FNHMVC/