Ответ
Метод расширения 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 не смогут корректно идентифицировать пользователя.