Для чего нужен OverrideAuthenticationAttribute?

Я применил метод контроллера, отмеченный System.Web.Http.OverrideAuthenticationAttribute в моем текущем проекте веб-API, и мне интересно, для чего это нужно?

Поиск в Google и Stackoverflow не отвечает на вопрос. Документация MSDN не содержит много информации. Он говорит только следующее:

Представляет атрибут фильтра, который переопределяет фильтры проверки подлинности определенный на более высоком уровне.

Кроме того, я рассмотрел источники:

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

    public Type FiltersToOverride
    {
        get
        {
            return typeof(IAuthenticationFilter);
        }
    }
}

Но это не проливает много света.

. Может ли кто-нибудь объяснить , какова цель использования OverrideAuthenticationAttribute? И, пожалуйста, дайте несколько примеров использования для лучшего понимания.

Ответ 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
}

Ответ 2

OverrideAuthentication предназначен для переопределения фильтров аутентификации, настроенных на более высоких уровнях. Скажем, у вас есть фильтр аутентификации, применяемый во всем мире.

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

И вы хотите, чтобы этот фильтр не запускался для определенного метода действий или контроллера. Вы можете использовать OverrideAuthentication на этом уровне, как это.

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

Теперь, в приведенном выше примере, вы применили MyAuthenticationFilter глобально. Скажем, вы хотите переопределить это и запустить другой фильтр, скажем 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(...)
    { ... }
}

Подробнее здесь. Проверьте раздел "Переопределение фильтра".