我有以下自定义类用于动态角色分配:
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()返回的空字符串,则上述函数应该更改以便匿名用户或任何人访问操作。
答案 0 :(得分:4)
嗯,据我所知,有几个机会可以做到这一点
首先,您可以在此处覆盖OnAuthorization并填写Roles属性。之后只需检查角色计数并决定调用AuthorizeCore或只返回(在这种情况下,您复制策略AuthorizeAttribute的开发人员)
其次,使用AllowAnonymous属性
第三,为每个用户创建自己的匿名角色作为默认角色
答案 1 :(得分:1)
如果我理解正确,你需要:
...
Roles = repository.GetAssignRole(controller, action);
if (Roles.Length == 0) return true;
return base.AuthorizeCore(httpContext);