ASP.NET Core с использованием нескольких методов аутентификации - PullRequest
0 голосов
/ 16 февраля 2019

Использование как промежуточного программного обеспечения для проверки подлинности на основе файлов cookie, так и промежуточного программного обеспечения для проверки подлинности на основе JWT.Когда я вхожу в систему, я создаю пользовательские утверждения и прикрепляю их к идентификационной информации на основе файлов cookie.Я также получаю токен jwt из внешнего источника, который имеет свои собственные требования (я использую этот токен для доступа к внешним ресурсам).Мой класс контроллера выглядит примерно так при включении Аутентификации

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
// Requires the following imports:
// using Microsoft.AspNetCore.Authentication.Cookies;
// using Microsoft.AspNetCore.Authentication.JwtBearer;
private const string AuthSchemes =
    CookieAuthenticationDefaults.AuthenticationScheme + "," +
    JwtBearerDefaults.AuthenticationScheme;

На основании приведенного выше фрагмента кода, если авторизация Cookie или JWT выполнена успешно, запрос считается Аутентифицированным.Мое требование состоит в том, чтобы отклонить запрос в случае сбоя авторизации Cookie или JWT.Использование только одной схемы не подходит для моего случая.Если мой файл cookie действителен, но срок действия моего токена истек, я хочу отклонить запрос на основании того, что он «не прошел проверку подлинности».Как я могу это сделать?

1 Ответ

0 голосов
/ 17 февраля 2019

Использовать аутентификацию на основе политик.Там вы можете проверить, имеет ли текущий ClaimsPrincipal (context.User) 2 Identities, 1 из каждой успешно пройденной схемы аутентификации.Настроить политику

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAllSchemes", policy =>
    {
        policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
        policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.RequireAssertion(context =>
        {
            return context.User.Identities.Count() == 2;
        });
    });
});

Указать политику авторизации для контроллера

[Authorize(Policy = "RequireAllSchemes")]
public class MixedController : Controller
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...