OverrideAuthenticationAttribute的用途是什么?

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

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

表示filter属性,该属性覆盖在更高级别定义的身份validationfilter。

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

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

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

那么有人可以解释使用OverrideAuthenticationAttribute的目的是什么? 请提供一些用例以便更好地理解。

OverrideAuthentication属性用于禁止全局身份validation筛选器 ,这意味着在使用此筛选器时将禁用所有全局身份validation筛选器(实现IAuthenticationFilter)。

假设您有一个名为BasicAuth的全局身份validationfilter:

 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(); } } } 

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

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

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

在下面的代码中,禁用全局身份validation筛选器,然后启用HostAuthentication筛选器以执行单个操作以启用外部登录提供程序(例如Facebook):

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

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

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

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

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

现在,在上面的示例中,您已MyAuthenticationFilter应用MyAuthenticationFilter 。 比如说,你想要覆盖它并运行另一个filter,比如说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(...) { ... } } 

更多信息在这里 。 查看“filter覆盖”部分。