我正在构建一个简单的CMS,其中角色是在管理面板中动态设置的。因此,授权控制器方法的现有方法(例如,添加[Authorize(Roles="admin")]
)已不再足够。角色 - 操作关系必须存储在数据库中,以便最终用户可以轻松地向/从管理面板中的其他人授予/获取权限。我该如何实现呢?
答案 0 :(得分:20)
如果要控制授权过程,则应该继承AuthorizeAttribute并覆盖AuthorizeCore方法。然后只需使用CmsAuthorizeAttribute
而不是默认值来装饰您的控制器。
public class CmsAuthorizeAttribute : AuthorizeAttribute
{
public override virtual bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
IIdentity identity = user.Identity;
if (!identity.IsAuthenticated) {
return false;
}
bool isAuthorized = true;
// TODO: perform custom authorization against the CMS
return isAuthorized;
}
}
这样做的缺点是您无法访问注入ctor的IoC,因此您必须直接从容器请求任何依赖项。
答案 1 :(得分:0)
这正是ASP.NET成员资格/配置文件为您所做的事情。它适用于Authorize属性。
如果您想自己动手,可以创建一个自定义动作过滤器,模仿标准授权动作过滤器的行为。下面的伪代码。
public MyAuthorizeAttribute : ActionFilterAttribute
{
public string MyRole { get; set; }
public void OnActionExecuting(ControllerContext context)
{
if (!(bool)Session["userIsAuthenticated"])
{
throw new AuthenticationException("Must log in.");
}
if (!Session["userRoles"].Contains(MyRole))
{
throw new AuthenticationException("Must have role " + MyRole);
}
}
}
答案 2 :(得分:0)
角色 - 行动关系必须是 存储在数据库中
您必须在控制器方法中检查您的安全性,除非您想要AuthorizeAttribute
的子类,以便它为您从数据库中查找角色。