Авторизовать пользователя на основе 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.

person juunas    schedule 06.02.2017