C# OverrideAuthenticationAttribute用于什么?

C# OverrideAuthenticationAttribute用于什么?,c#,asp.net,.net,web-services,asp.net-web-api,C#,Asp.net,.net,Web Services,Asp.net Web Api,我在当前的Web API项目中遇到了一个标记为System.Web.Http.OverrideAuthenticationAttribute的控制器方法,我很好奇这是为了什么 在Google和Stackoverflow中搜索并不能回答这个问题。不包含太多信息。它只说了以下几点: 表示覆盖身份验证筛选器的筛选器属性 在更高的层次上定义 此外,我还查看了以下来源: public sealed class OverrideAuthenticationAttribute : Attribute, IOv

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

在Google和Stackoverflow中搜索并不能回答这个问题。不包含太多信息。它只说了以下几点:

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

此外,我还查看了以下来源:

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

    public Type FiltersToOverride
    {
        get
        {
            return typeof(IAuthenticationFilter);
        }
    }
}
但这并不能说明什么


那么,有谁能解释一下使用
覆盖身份验证属性的目的是什么?为了更好地理解,请给出它的一些用例。

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

// Applied globally in WebApiConfig    
config.Filters.Add(new MyAuthenticationFilter());
public class ValuesController : ApiController
{
    [OverrideAuthentication]
    public string Get()
    { ...  }
}
public class ValuesController : ApiController
{
    // Removes all filters applied globally or at the controller level
    [OverrideAuthentication]
    [MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
    public string Post(...)
    { ... }
}
并且,您希望停止针对特定操作方法或控制器运行此筛选器。您可以在该级别使用
OverrideAuthentication
,如下所示

// Applied globally in WebApiConfig    
config.Filters.Add(new MyAuthenticationFilter());
public class ValuesController : ApiController
{
    [OverrideAuthentication]
    public string Get()
    { ...  }
}
public class ValuesController : ApiController
{
    // Removes all filters applied globally or at the controller level
    [OverrideAuthentication]
    [MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
    public string Post(...)
    { ... }
}
现在,在上面的示例中,您已经全局应用了
MyAuthenticationFilter
。比如说,您希望覆盖该选项并运行另一个筛选器,比如说,仅针对
Post
操作方法运行另一个筛选器
MyAnotherAuthenticationFilter
。你可以这样做

// Applied globally in WebApiConfig    
config.Filters.Add(new MyAuthenticationFilter());
public class ValuesController : ApiController
{
    [OverrideAuthentication]
    public string Get()
    { ...  }
}
public class ValuesController : ApiController
{
    // Removes all filters applied globally or at the controller level
    [OverrideAuthentication]
    [MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
    public string Post(...)
    { ... }
}

更多信息。查看“筛选器覆盖”部分。

使用
覆盖身份验证
属性抑制全局身份验证筛选器,这意味着使用此筛选器时将禁用所有全局身份验证筛选器(实现IAAuthenticationFilter)

假设您有一个名为
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
属性筛选,然后配置要用于该特定操作的新筛选器。当您与外部登录提供程序集成,并且不希望任何现有的全局身份验证筛选器扰乱您的外部登录身份验证时,这将非常有用

在下面的代码中,禁用全局身份验证筛选器,然后为单个操作启用
主机身份验证
筛选器,以启用外部登录提供商(例如Facebook):

//获取api/Account/ExternalLogin
[覆盖认证]
[主机身份验证(Startup.ExternalCookieAuthenticationType)]
[异名]
[HttpGet(“ExternalLogin”,RouteName=“ExternalLogin”)]
公共异步任务外部登录(字符串提供程序)
{
//认证码
}

在您的示例中,为什么您的
基本身份验证属性是从
ActionFilterAttribute
派生而来的,而不是
AuthorizationAttribute
?它可能有,但我不想覆盖现有身份验证过滤器,而是实现一个新的身份验证过滤器。这就是为什么我继承ActionFilter属性并实现IAAuthenticationFilter:)@ZenCoder,感谢您的回答和清晰的代码示例@FarisZacina您能否在这里使用AuthorizationFilter,以及您对Erik Phillips的回复—这是否意味着授权属性是一个身份验证属性。还是源于一个?感谢您的回答,尤其是链接到您全面的MSDN杂志文章!这是我这一次读到的关于Web API安全性的最好的读物!