用另一个覆盖授权过滤器

时间:2015-08-07 13:13:26

标签: c# asp.net-web-api2 authorize-attribute asp.net-mvc-filters

我的Web Api项目中定义了默认CustomAuthorizeAttribute

config.Filters.Add(new CustomAuthorizeAttribute());

但是我有一个特殊的控制器,我想使用SpecialAuthorizeAttribute

[SpecialAuthorize]
public class MySpecialController : ApiController

在Asp.Net vNext中,我们有一个新属性来覆盖默认过滤器,但是如何让它在Web Api 2中运行?

修改1:

一种可能的(但不是理想的)解决方案是让CustomAuthorizeAttribute检查Controller或Action范围内是否有另一个AuthorizeAttribute。在我的情况下,我只有SpecialAuthorizeAttribute所以:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<SpecialAuthorizeAttribute>().Any() || actionContext.ActionDescriptor.GetCustomAttributes<SpecialAuthorizeAttribute>().Any())
        {
            return;
        }
        base.OnAuthorization(actionContext);
    }

    public override System.Threading.Tasks.Task OnAuthorizationAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
    {
        return base.OnAuthorizationAsync(actionContext, cancellationToken);
    }
}

2 个答案:

答案 0 :(得分:0)

您可以使用OverrideAuthenticationAttribute。 您可以this answer使用此属性来抑制全局身份验证过滤器。

答案 1 :(得分:0)

OverrideAuthorization属性完全适合您的要求(在ASP.NET Web API 2中)。您可以在this文章中以简单的术语找到其用法和目的。