Ответ 1
Атрибут 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
}