ASP.NET Core - изменить JWT SecurityKey во время выполнения - PullRequest
0 голосов
/ 13 января 2019

Имея конфигурацию, подобную этой:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(x =>
{ 
   x.TokenValidationParameters = new TokenValidationParameters
   {
      ValidateIssuer = false,
      ValidateAudience = false,

      ValidateIssuerSigningKey = true,
      IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(config.JwtSecret)),

      ValidateLifetime = true,
      ClockSkew = TimeSpan.Zero
    };
 });

Есть ли правильный способ изменить IssuerSigningKey во время выполнения?

Идеи, которые приходят на ум:

  • сохраните ссылку на TokenValidationParameters и просто замените IssuerSigningKey

  • расширить SymmetricSecurityKey и выполнить нечто подобное, как в предыдущем пункте

Оба эти способа кажутся слишком глупыми. Я предполагаю, что есть какой-то механизм для достижения этого правильным путем, я просто не мог его найти.

1 Ответ

0 голосов
/ 10 мая 2019

Я знаю, что это старая ветка, но все равно публикую свой ответ, потому что я наткнулся на эту ветку во время поиска того же сценария и думаю, что он может быть полезен для других.

В параметрах TokenValidationParameters есть делегат IssuerSigningKeyResolver, который можно установить при настройке других параметров. При каждом запросе аутентификации ваш делегат будет выполняться. Вы можете динамически возвращать SecurityKey.

Например:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,

                //ValidIssuer = jwtSettings.ValidIssuer,
                //ValidAudience = jwtSettings.ValidAudience,
                //IssuerSigningKey = issuerSigningKey,
                IssuerSigningKeyResolver = (token, secutiryToken, kid, validationParameters) =>
                {
                    SecurityKey issuerSigningKey = null;
                    // Set issuerSigningKey as per your logic.
                    // This delegate will be executed for eahc request.

                    return new List<SecurityKey>() { issuerSigningKey };
                }

            };

        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...