具有Role和AllowAnonymous覆盖的管理员角色全局过滤器?

时间:2012-05-17 10:38:59

标签: asp.net-mvc-3 authorize-attribute

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

我已尝试在LogonAuthorize属性构造函数中添加Roles:

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

..但是这会将所有操作限制为管理员,我无法使用操作的“授权”属性覆盖。

1 个答案:

答案 0 :(得分: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 attributre默认适用于所有控制器和操作,并且需要角色" Admin"但它只授权未定义AllowAnonymous或OverrideAuthorize。