动态地将控制器操作权限分配给asp.net MVC中的角色

Job*_*med 5 asp.net asp.net-mvc asp.net-identity-2

我正在研究asp.net mvc 5.我想动态地将控制器的动作方法的权限分配给角色,而不需要在Authorize属性中强制转换角色.

这是场景 - 在我的项目中,我有四个角色 - 学生,教师,项目官员和管理员.我希望管理员可以随时改变每个角色的可访问性.我不想在控制器的每个操作名称之前使用角色名称对authorize属性进行硬编码,因为管理员将无法更改每个角色的权限.

我想创建一个页面,其中控制器的每个操作方法都将列为复选框,管理员可以为角色选择操作复选框.然后,该角色用户将获得这些操作方法的可访问性.

在这里,我想让UI如下 -

角色管理UI

任何人都可以通过提供任何建议或代码或链接来帮助我这样做吗?

Sam*_*ari 6

想象一下,你有服务返回基于控制器和动作名称的角色数组,如下所示:

public class RoleProvider
{
    public string[] Get(string controller, string action)
    {
        // get your roles based on the controller and the action name 
        // wherever you want such as db
        // I hardcoded for the sake of simplicity 
        return new string[]{"Student", "Teacher"};
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以编写自己的授权属性,如下所示:

public class DynamicRoleAuthorizeAttribute: AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var controller = httpContext.Request.RequestContext
            .RouteData.GetRequiredString("controller");
        var action = httpContext.Request.RequestContext
            .RouteData.GetRequiredString("action");
        // feed the roles here
        Roles = string.Join("," ,_rolesProvider.Get(controller, action));
        return base.AuthorizeCore(httpContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用您的自定义授权属性而不是旧的属性,如下所示:

[DynamicRoleAuthorize]
public ActionResult MyAction()
{

}
Run Code Online (Sandbox Code Playgroud)


小智 1

我认为唯一的方法是实现您自己的授权属性,您可以在其中实现您自己的授权逻辑。

在您的情况下,您应该有一个将角色和控制器操作关联起来的表,并在自定义授权属性中检查该表。