OverrideAuthenticationAttribute用于什么?

Ale*_*mov 13 .net c# asp.net web-services asp.net-web-api

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

在Google和Stackoverflow中搜索无法回答这个问题.MSDN文档不包含太多信息.它只说以下内容:

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

另外,我已经看了一下来源:

public sealed class OverrideAuthenticationAttribute : Attribute, IOverrideFilter, IFilter
{
    public bool AllowMultiple
    {
        get
        {
            return false;
        }
    }

    public Type FiltersToOverride
    {
        get
        {
            return typeof(IAuthenticationFilter);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这并没有带来太多启示.

那么任何人都可以解释使用它的目的是OverrideAuthenticationAttribute什么?请提供一些用例以便更好地理解.

Far*_*ina 13

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用以下代码将过滤器配置为所有控制器的全局过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new BasicAuthAttribute());
    }
}
Run Code Online (Sandbox Code Playgroud)

假设您想在单个控制器或控制器操作上使用不同的身份验证策略.在这种情况下,您可以禁用全局身份验证.使用该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
}
Run Code Online (Sandbox Code Playgroud)