Какие сервисы и зависимости добавляет метод AddAuthentication в ASP.NET Core?

«Какие сервисы и зависимости добавляет метод AddAuthentication в ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод расширения AddAuthentication, вызываемый в ConfigureServices, регистрирует в DI-контейнере фундаментальные сервисы, необходимые для работы подсистемы аутентификации. Он не добавляет конкретные схемы (провайдеры), а подготавливает инфраструктуру для них.

Основные добавляемые сервисы:

  • IAuthenticationService — основной сервис, обрабатывающий логику аутентификации (например, HttpContext.AuthenticateAsync).
  • IAuthenticationSchemeProvider — управляет зарегистрированными схемами аутентификации (Cookie, JWT Bearer, OAuth и т.д.).
  • IAuthenticationHandlerProvider — отвечает за создание обработчиков для конкретных схем.
  • IAuthenticationRequestHandler — для схем, которые могут обрабатывать запросы самостоятельно (например, OAuth-редиректы).

Типичный паттерн использования:

public void ConfigureServices(IServiceCollection services)
{
    // 1. Добавляем базовые сервисы аутентификации и настраиваем схемы по умолчанию
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    // 2. Добавляем конкретные обработчики (провайдеры) аутентификации
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "my-issuer",
            ValidateAudience = true,
            ValidAudience = "my-audience",
            ValidateLifetime = true
        };
    })
    .AddCookie("SecondaryCookieScheme"); // Можно добавить несколько схем

    services.AddControllers();
}

public void Configure(IApplicationBuilder app)
{
    // 3. Включаем middleware аутентификации в конвейер обработки запроса
    // Важно: UseAuthentication() должен идти ДО UseAuthorization() и ПОСЛЕ UseRouting()
    app.UseRouting();
    app.UseAuthentication(); // <-- Активирует зарегистрированные сервисы
    app.UseAuthorization();
    app.UseEndpoints(endpoints => endpoints.MapControllers());
}

Ключевой момент: Без вызова AddAuthentication последующий вызов UseAuthentication() в конвейере не будет иметь эффекта, а атрибуты вроде [Authorize] и методы HttpContext.User не смогут корректно идентифицировать пользователя.