Аутентификация и авторизация в ASP.NET Core: схемы, handlers

↑ 3.4 Аутентификация и авторизация · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Первым уточняют разницу authN и authZ и как в ASP.NET Core устроены схемы.

Объяснение

  • Аутентификация (authN) — «кто вы»: результат — ClaimsPrincipal.
  • Авторизация (authZ) — «что вам можно»: решение по политике/роли.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(o => { /* параметры */ })
    .AddCookie("cookie");
builder.Services.AddAuthorization();
 
app.UseAuthentication();   // строит HttpContext.User
app.UseAuthorization();    // проверяет требования endpoint
ПонятиеЧто это
Schemeименованная конфигурация способа аутентификации (Bearer, Cookie, API key)
Handlerреализация схемы: AuthenticateAsync, ChallengeAsync (401), ForbidAsync (403)
ClaimsPrincipalпользователь = набор ClaimsIdentity с Claim
Default schemeсхема, используемая по умолчанию

Свой handler (пример API-ключа)

public class ApiKeyHandler(IOptionsMonitor<AuthenticationSchemeOptions> o, ILoggerFactory l, UrlEncoder e, IKeyStore keys)
    : AuthenticationHandler<AuthenticationSchemeOptions>(o, l, e)
{
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        if (!Request.Headers.TryGetValue("X-Api-Key", out var key) || !await keys.IsValidAsync(key!))
            return AuthenticateResult.Fail("invalid key");
        var id = new ClaimsIdentity([new Claim(ClaimTypes.Name, "service")], Scheme.Name);
        return AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(id), Scheme.Name));
    }
}

Endpoint защищают [Authorize]/RequireAuthorization(), анонимный доступ — [AllowAnonymous].

Нюансы и подводные камни

  • Порядок: UseAuthentication строго перед UseAuthorization.
  • Несколько схем: указывайте AuthenticationSchemes в политике.
  • 401 без токена и 403 при нехватке прав — разные ответы handler-а.
  • Fallback policy (RequireAuthenticatedUser) защищает всё по умолчанию.

Практика

  1. Защитите API двумя схемами: JWT и API key.
  2. Настройте fallback policy и отметьте открытые endpoint-ы AllowAnonymous.
  3. Выведите User.Claims в отладочном endpoint.

Вопросы с ответами

Связанные темы