使用MVC授权进行隐式角色分配

时间:2014-02-02 03:47:58

标签: c# asp.net-mvc authentication authorization roles

我正在使用自己的自定义授权属性MyAuthorizeAttribute : AuthorizeAttribute来执行非常有效的授权。问题在于角色分配。在我正在使用的安全模型中,如果用户在管理员中包含Admin角色UserManager角色。所以

[MyAuthorize(Roles = "Admin")]

允许访问所有方法。所以直观的解决方案是在每个控制器上分配“Admin”。 但这是最干净的解决方案吗?

如果我有几十个角色可以使用,那该怎么办? 代码行将如下所示

[MyAuthorize(Roles = "Admin, Role A, Role B... Role Z")]

如果我决定重命名一个角色名称,我应该使用角色ID吗?。 如果我在自定义授权方法中筛选角色,那么我冒着在该函数中创建巨大的switch语句的风险,如下所示:

switch(Controller Accessed) 
{ 
 case Index: //if user, admin, or any other role exist

 case Manage: //if admin role exists

}

1 个答案:

答案 0 :(得分:0)

将来更容易重命名

如果您希望更改角色名称,则在重构时使用常量或枚举将获得更好的工具支持。

public static class Roles 
{ 
   public const string UserAdmin = "User Administrator";
   public const string SuperAdmin = "Super Administrator";
   public const string RegularUser = "Regular User";
}

public enum Roles 
{ 
   UserAdmin,
   SuperAdmin,
   RegularUser
}

重新使用常用权限组

如果您发现自己在权限中使用相同的角色,则可以通过继承MyAuthorize过滤器或MVC基本控制器来简化它。下面继承BaseAdminController的任何类也都应用了MyAuthorize过滤器。

[MyAuthorize(Roles = Roles.UserAdmin, Roles.SuperAdmin)]
public abstract class BaseAdminController : Controller { 

}

public AdminAuthorize : MyAuthorize 
{ 
   public AdminAuthorize() 
   { 
      base.Roles = new[] { Roles.UserAdmin, Roles.SuperAdmin };
   }
}