Авторизация пользователя на основе API-ключа, указанного в заголовке запроса в ASP.NET Core
Я пытаюсь переписать некоторые полномочия, которые у меня есть для ASP.NET 4.6 в ASP.NET Core.
Я понимаю, что Авторизация немного изменилась, и мне трудно реализовать мою очень простую стратегию аутентификации в ASP.NET Core.
Мои требования:
Каждый запрос к серверу должен включать заголовок с именем "ключ". Основываясь на значении этого ключа, я смогу запросить базу данных и проверить, представляет ли этот ключ обычный пользователь или администратор. Если запрос не содержит действительный ключ, запрос не авторизован.
Как бы я реализовать это в ASP.NET Core? Каждый пример, который я нахожу, кажется излишним для моих нужд.
В ASP.NET 4.6 я использовал свои собственные AuthorizeAttributes для использования на моих контроллерах, например
[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}
а также
[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() {}
Могу ли я сделать то же самое в ASP.NET Core?
1 ответ
В ASP.NET Core рекомендуется не наследовать от AuthorizeAttribute. Вместо этого вы можете создавать собственные политики авторизации: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims.
Вам понадобится обработчик аутентификации, который создает ClaimsIdentity для пользователя на основе заголовка. Затем вы можете сделать политики, которые утверждают существование определенных претензий на пользователя.
Вы можете найти реализацию базовой аутентификации здесь: https://github.com/blowdart/idunno.Authentication. Обратите внимание на комментарий Барри, конечно:
Он предназначен для демонстрации того, как написать промежуточное программное обеспечение для аутентификации, а не для того, чтобы вы всерьез задумывались об использовании.
Его ядро находится в BasicAuthenticationHandler, который наследуется от AuthenticationHandler<BasicAuthenticationOptions>
,
Принципал в этой реализации создается в обратном вызове события, сделанном разработчиком, в примере он находится здесь:
if (context.Username == context.Password)
{
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer),
new Claim(ClaimTypes.Name, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer)
};
context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
context.Success();
}
Билет аутентификации затем создается в обработчике после вызова этого обратного вызова на основе принципала:
var ticket = new AuthenticationTicket(validateCredentialsContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
Я также сделал статью о реализации пользовательских схем аутентификации: Создание схемы аутентификации в ASP.NET Core 2.0.