Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVC授权的隐式角色分配_C#_Asp.net Mvc_Authentication_Authorization_Roles - Fatal编程技术网

C# 使用MVC授权的隐式角色分配

C# 使用MVC授权的隐式角色分配,c#,asp.net-mvc,authentication,authorization,roles,C#,Asp.net Mvc,Authentication,Authorization,Roles,我正在使用自己的自定义授权属性MyAuthorizeAttribute:AuthorizeAttribute进行授权,这非常有效。问题在于角色分配。在我使用的安全模型中,如果用户具有Adminroleuser并且Manager角色包含在Admin中,那么我将使用该模型。所以 [MyAuthorize(Roles = "Admin")] 允许访问所有方法。因此,直观的解决方案是在每个控制器上分配“管理员”但这是最干净的解决方案吗? 还有,如果我有几十个角色要处理呢代码行如下所示: [MyAuth

我正在使用自己的自定义授权属性
MyAuthorizeAttribute:AuthorizeAttribute
进行授权,这非常有效。问题在于角色分配。在我使用的安全模型中,如果用户具有
Admin
role
user
并且
Manager
角色包含在Admin中,那么我将使用该模型。所以

[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

}

使以后更容易重命名

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

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

重新使用公共权限组

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

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

}

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

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