ASP.NET MVC - 动态授权

时间:2010-03-07 20:50:50

标签: asp.net-mvc content-management-system forms-authentication authorization roles

我正在构建一个简单的CMS,其中角色是在管理面板中动态设置的。因此,授权控制器方法的现有方法(例如,添加[Authorize(Roles="admin")])已不再足够。角色 - 操作关系必须存储在数据库中,以便最终用户可以轻松地向/从管理面板中的其他人授予/获取权限。我该如何实现呢?

3 个答案:

答案 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的子类,以便它为您从数据库中查找角色。