Аутентификация и авторизация в ASP.NET Core: схемы, handlers
↑ 3.4 Аутентификация и авторизация · → Следующая
Зачем это на собесе
Первым уточняют разницу 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) защищает всё по умолчанию.
Практика
- Защитите API двумя схемами: JWT и API key.
- Настройте fallback policy и отметьте открытые endpoint-ы
AllowAnonymous. - Выведите
User.Claimsв отладочном endpoint.
Вопросы с ответами
Разница authN и authZ?
AuthN устанавливает личность, authZ решает, разрешено ли ей действие.
Что такое ClaimsPrincipal?
Модель пользователя в .NET: набор identity, каждая с claims (утверждениями).
Зачем несколько схем?
Поддержка разных клиентов: браузер (cookie), мобильные/сервисы (Bearer), интеграции (API key).