ASP.NET MVC - 动态授权

xan*_*rus 14 asp.net-mvc authorization forms-authentication roles content-management-system

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

Ric*_*lay 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您将无法访问ctor注入的IoC,因此您必须直接从容器请求任何依赖项.


rma*_*mac 0

这正是 ASP.NET 会员资格/个人资料内容为您所做的事情。它与授权属性一起使用。

如果您想推出自己的操作过滤器,您可以创建一个自定义操作过滤器来模仿标准授权操作过滤器的行为。下面的伪代码。

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)