我已经设置了一个全局过滤器,要求根据Rick Anderson's article登录所有方法。现在我想更进一步,要求所有操作仅被授权为“Admin”角色,除非被文章中的AllowAnonymous属性或[Authorize(Roles =“Staff”)]覆盖,这将允许“Staff”AND “管理员”访问。
我已尝试在LogonAuthorize属性构造函数中添加Roles:
public LogonAuthorize()
{
this.Roles = "Admin";
}
..但是这会将所有操作限制为管理员,我无法使用操作的“授权”属性覆盖。
答案 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。