0

我根据Rick Anderson 的文章设置了一个全局过滤器,要求所有方法都需要登录。现在我想更进一步,要求所有操作仅授权给“管理员”角色,除非被文章中的 AllowAnonymous 属性或 [Authorize(Roles="Staff")] 覆盖,然后允许“Staff”和“管理员”访问。

我尝试在 LogonAuthorize 属性构造函数中添加角色:

    public LogonAuthorize()
    {
        this.Roles = "Admin";
    }

..但这将所有操作限制为管理员,我不能在操作上使用 Authorize 属性覆盖。

4

1 回答 1

4

很快就想通了:O

我创建了另一个授权属性:

public sealed class OverrideAuthorize : AuthorizeAttribute
{
}

并将其用作 LogonAuthorize 中的测试:

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
        || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
        || filterContext.ActionDescriptor.IsDefined(typeof(OverrideAuthorize), true)
        || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(OverrideAuthorize), true);

        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }

现在我只需要使用 OverrideAuthorize(或 AllowAnonymous)标记我列入白名单的操作:

    [OverrideAuthorize(Roles = "Staff, Administrator")]
    public ActionResult Index()
    {
        return View();
    }

因此,LogonAuthorize 属性默认适用于所有控制器和操作,并且需要角色“Admin”,但它仅在未定义 AllowAnonymous 或 OverrideAuthorize 时授权。

于 2012-05-17T10:55:35.797 回答