授权具有多个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... } }