用另一个覆盖授权过滤器

本文关键字:过滤器 授权 覆盖 另一个 | 更新日期: 2023-09-27 18:06:47

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

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

然而,我有一个特殊的控制器,我想使用SpecialAuthorizeAttribute

[SpecialAuthorize]
public class MySpecialController : ApiController

在Asp。Net vNext我们有一个新的属性来覆盖默认的过滤器,但是我如何使它在Web Api 2中工作呢?

编辑1:

一个可能的(但不是理想的)解决方案是让CustomAuthorizeAttribute检查控制器或操作范围内是否有另一个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);
    }
}

用另一个覆盖授权过滤器

您可以使用OverrideAuthenticationAttribute。正如您可以得到的答案,该属性用于抑制全局身份验证过滤器。

OverrideAuthorization属性是完全合适的(在ASP中)。. NET Web API 2)以满足您的需求。在本文中,您可以简单地找到它的用法和目的。