What OverrideAuthenticationAttribute is for?

本文关键字:for is OverrideAuthenticationAttribute What | 更新日期: 2023-09-27 18:27:53

我在我当前的Web API项目中遇到了一个用System.Web.Http.OverrideAuthenticationAttribute标记的控制器方法,我很好奇这是为了什么?

在谷歌和Stackoverflow中搜索并不能回答这个问题。MSDN文档中没有包含太多信息。它只说以下内容:

表示覆盖身份验证筛选器的筛选器属性在更高级别上定义。

此外,我还查看了来源:

public sealed class OverrideAuthenticationAttribute : Attribute, IOverrideFilter, IFilter
{
    public bool AllowMultiple
    {
        get
        {
            return false;
        }
    }
    public Type FiltersToOverride
    {
        get
        {
            return typeof(IAuthenticationFilter);
        }
    }
}

但这并没有带来太多的启示。

那么,有人能解释一下使用OverrideAuthenticationAttribute的目的是什么吗?为了更好地理解,请给出一些它的用例。

What OverrideAuthenticationAttribute is for?

OverrideAuthentication属性用于抑制全局身份验证筛选器,这意味着在使用此筛选器时,所有全局身份验证过滤器(实现IAuthenticationFilter)都将被禁用。

假设您有一个名为BasicAuth:的全局身份验证过滤器

public class BasicAuthAttribute : ActionFilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext filterContext)
    { }
    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        var user = filterContext.HttpContext.User;
        if (user == null || !user.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }
    }
}

过滤器被配置为所有控制器的全局过滤器,代码为:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new BasicAuthAttribute());
    }
}

假设您希望对单个控制器或控制器操作使用不同的身份验证策略。在这种情况下,您可以禁用全局身份验证。使用OverrideAuthentication属性进行筛选,然后配置要用于该特定操作的新筛选器。当您与外部登录提供程序集成时,这很有帮助,并且您不希望任何现有的全局身份验证过滤器扰乱您的外部登录身份验证。

在下面的代码中,全局身份验证过滤器被禁用,然后HostAuthentication过滤器被启用用于单个操作,以启用外部登录提供商(例如Facebook):

// GET api/Account/ExternalLogin
[OverrideAuthentication]
[HostAuthentication(Startup.ExternalCookieAuthenticationType)]
[AllowAnonymous]
[HttpGet("ExternalLogin", RouteName = "ExternalLogin")]
public async Task<IHttpActionResult> ExternalLogin(string provider)
{
    // Auth code
}

OverrideAuthentication用于覆盖在更高级别配置的身份验证筛选器。比如说,您有一个像这样全局应用的身份验证过滤器。

// Applied globally in WebApiConfig    
config.Filters.Add(new MyAuthenticationFilter());

并且,您希望停止为特定操作方法或控制器运行此筛选器。您可以在该级别使用OverrideAuthentication,如下所示。

public class ValuesController : ApiController
{
    [OverrideAuthentication]
    public string Get()
    { ...  }
}

现在,在上面的示例中,您已经全局应用了MyAuthenticationFilter。比如说,您想覆盖它并运行另一个筛选器,比如说MyAnotherAuthenticationFilter仅用于Post操作方法。你可以这样做。

public class ValuesController : ApiController
{
    // Removes all filters applied globally or at the controller level
    [OverrideAuthentication]
    [MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
    public string Post(...)
    { ... }
}

点击此处了解更多信息。查看"过滤器覆盖"部分。