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覆盖”部分。