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
}
BasicAuthAttribute
继承自ActionFilterAttribute
而不是AuthorizationAttribute
? - Erik Philips