Иметь две идентификационные данные пользователя в заявке (ClaimsPrincipal), при этом только одна используется для [Authorize] - PullRequest
1 голос
/ 24 апреля 2020

У меня есть два JWT, которые включены во все вызовы моего сервиса. Первый (называемый UserJwt) - это тот, который я хочу использовать для [Authorize] для большинства сервисных операций. Второй (называемый ApplicationJwt) содержит полезную информацию, которую я также хотел бы видеть в списке User.Identities объектов ClaimsIdentity.

Я настроил свой код так, чтобы всегда использовался UserJwt ApplicationJwt игнорируется:

services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        // Setup the JWT stuff here for the UserJwt         
    })

Это работает нормально, но я хочу, чтобы оба JWT были проанализированы и помещены в список User.Identities.

Я попытался настроить свой код на следуйте этому ответу , (на вопрос: Используйте множественную аутентификацию на носителе JWT ), но это позволяет либо один (UserJwt или ApplicationJwt).

В худшем случае мне нужно, чтобы требовалось и то, и другое. Тем не менее, я предпочитаю требовать только UserJwt, но включать ApplicationJwt в качестве ClaimsIdentity, если найден.

    services.AddAuthentication()
        .AddJwtBearer("UserJwt", options =>
        {
            // Setup the JWT stuff here for the UserJwt
        })
        .AddJwtBearer("ApplicationJwt", options =>
         {
             // Setup the JWT stuff here for the ApplicationJwt
         });

    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("UserJwt", "ApplicationJwt")
            .Build();
    });

Как я могу получить оба JWT в списке User.Identities Может ли UserJwt использоваться для [Authorize], но также разрешать [Authorize(Policy = "ApplicationJwt")] для некоторых операций службы?

1 Ответ

1 голос
/ 25 апреля 2020

Один из вариантов здесь добавление пользовательских требований к политике по умолчанию.

Предположим, UserJwt содержит определенные c утверждения:

options.DefaultPolicy = new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes("UserJwt", "ApplicationJwt")
    .RequireAuthenticatedUser()
    .AddRequirements(
        // Assume UserJwt contains a AuthenticationMethod claim where 
        // value is equal to User
        new ClaimsAuthorizationRequirement(
            ClaimTypes.AuthenticationMethod, new[] { "User" }
        )
    )
    .Build();

Также см. Другие встроенные типы требований .

Обратите внимание, что, если требование не выполнено, пользователь все еще проходит проверку подлинности, но ему запрещен доступ. Для обработки запрещенного сценария используйте JwtBearerEvents.OnForbidden событие:

OnForbidden = async context =>
{
    context.Response.StatusCode = 401;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...