【问题标题】:Implicit role assignment using MVC authorization使用 MVC 授权的隐式角色分配
【发布时间】:2014-02-25 17:24:12
【问题描述】:

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

[MyAuthorize(Roles = "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

}

【问题讨论】:

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


    【解决方案1】:

    让将来更容易重命名

    如果您希望角色名称发生变化,如果您使用常量或枚举进行重构,您将获得更好的工具支持。

    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 };
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 2010-10-21
      • 2013-04-06
      • 1970-01-01
      • 2013-12-21
      • 2016-06-21
      • 2021-09-04
      • 2017-09-16
      • 2019-12-08
      相关资源
      最近更新 更多