授权具有多个angular色的属性

我想将授权添加到控制器,一次为多个angular色。

通常情况下,看起来像这样:

[Authorize(Roles = "RoleA,RoleB,RoleC")] public async Task<ActionResult> Index() { } 

但是我已经把我的angular色存储在const中,因为它们可能会在某些时候改变或延长。

 public const RoleA = "RoleA"; public const RoleB = "RoleB"; public const RoleC = "RoleC"; 

我不能这样做,因为在编译时必须知道string:

 [Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)] public async Task<ActionResult> Index() { } 

有没有办法来解决这个问题?

我可以写一个只包含“RoleA,RoleB,RoleC”的const – 但我不喜欢魔术string,这是一个魔术string。 更改angular色的名称并忘记更改组合string将是一场灾难。

我正在使用MVC5。 ASP.NET身份和angular色在编译时已知。

尝试创build像这样的自定义授权属性。

 public class AuthorizeRolesAttribute : AuthorizeAttribute { public AuthorizeRolesAttribute(params string[] roles) : base() { Roles = string.Join(",", roles); } } 

假设你的angular色对于多个控制器是一样的,创build一个辅助类:

 public static class Role { public const string Administrator = "Administrator"; public const string Assistant = "Assistant"; } 

然后像这样使用它:

 public class MyController : Controller { [AuthorizeRoles(Role.Administrator, Role.Assistant)] public ActionResult AdminOrAssistant() { return View(); } } 

确保你从你的自定义属性类派生System.Web.Mvc.AuthorizeAttribute和NOT System.Web.Http.AuthorizeAttribute

我遇到了同样的问题。 一旦我改变了,一切都奏效了。

您可能还需要将以下内容添加到您的自定义属性类中:

 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 

不知道为什么每个人都接受这个答案。 我完全按照提及,现在它绝对没有授权检查。 匿名用户现在可以连接到用这个自定义属性装饰的每个方法…我发现解决这个问题的最好和最简单的方法就是连接Authorize属性中的angular色。

 [Authorize(Roles = CustomRoles.Admin + "," + CustomRoles.OtherRole)] 

用CustomRole这样的常量string类:

 public static class CustomRoles { public const string Admin = "Admin"; // and so on.. } 

我觉得自定义的授权属性对于这个问题是矫枉过正的,除非你有大量的angular色。

由于必须在编译时知道该string,为什么不创build一个静态的Role类,该类包含已定义的angular色的公共string,然后添加逗号分隔的string与要授权的特定angular色:

 public static class Roles { public const string ADMIN = "Admin"; public const string VIEWER = "Viewer"; public const string ADMIN_OR_VIEWER = ADMIN + "," + VIEWER; } 

然后,您可以在控制器类或控制器方法(或两者)上使用授权属性:

 [Authorize(Roles = Roles.ADMIN] public class ExampleController : Controller { [Authorize(Roles = Roles.ADMIN_OR_VIEWER) public ActionResult Create() { ..code here... } }