使用asp.net mvc 3进行动态角色分配

时间:2012-12-12 07:21:41

标签: c# asp.net-mvc-3

我有以下自定义类用于动态角色分配:

 public class DynamicAuthorizeAttribute : AuthorizeAttribute
    {
        IVRControlPanelRepository repository = new IVRControlPanelRepository();
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var controllerName = httpContext.Request.RequestContext.RouteData.Values["controller"];
            var actionName = httpContext.Request.RequestContext.RouteData.Values["action"];
            string controller = controllerName.ToString() + "Controller";
            string action = actionName.ToString();    
            repository.GetAssignRole(controller, action);    
            GetRolesFromDatabase(controllerName, actionName);
             //  Roles = "Role1,Role2,Role3"; 
            Roles = repository.GetAssignRole(controller, action);    
            return base.AuthorizeCore(httpContext);
        }
    }

以下是返回用逗号

分隔的角色字符串的函数
public string GetAssignRole(string controllername, string actionname)
        {
            using (AppEntities db = new AppEntities())
            {
                var result = from u in db.AssignRoles where (u.ControllerName == controllername && u.ActionName == actionname) select u;                    
                if (result.Count() != 0)
                {
                    var rol = result.FirstOrDefault();    
                    return rol.Role;
                }
                else
                {
                    return "";
                }                    
            }      
        }

我已将属性[DynamicAuthorizeAttribute]放置到所有控制器的所有操作中。

问题:

如果从GetAssignRole()返回的角色为空,则会将其重定向到LogOn。但实际上,如果上面代码中的Roles="",我实际上希望将其指定为未经授权的操作访问权限。如果角色=“管理员,会员”,它可以正常工作 如果角色是从GetAssignRole()返回的空字符串,则上述函数应该更改以便匿名用户或任何人访问操作。

2 个答案:

答案 0 :(得分:4)

嗯,据我所知,有几个机会可以做到这一点

首先,您可以在此处覆盖OnAuthorization并填写Roles属性。之后只需检查角色计数并决定调用AuthorizeCore或只返回(在这种情况下,您复制策略AuthorizeAttribute的开发人员)

其次,使用AllowAnonymous属性

第三,为每个用户创建自己的匿名角色作为默认角色

答案 1 :(得分:1)

如果我理解正确,你需要:

...
Roles = repository.GetAssignRole(controller, action);    
if (Roles.Length == 0) return true;
return base.AuthorizeCore(httpContext);