ASP.NET Core - 在运行时更改 JWT SecurityKey

loo*_*awa 5 jwt asp.net-core

有一个类似这样的配置:

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
    };
 });
Run Code Online (Sandbox Code Playgroud)

是否有在运行时更改 IssuerSigningKey 的正确方法?

想到的想法:

  • 保留对 TokenValidationParameters 的引用,只需替换 IssuerSigningKey

  • 扩展 SymmetricSecurityKey 并执行与上一点类似的操作

这两种方式似乎都太hacky了。我认为有某种机制可以以正确的方式实现这一点,我只是找不到它。

Ame*_*mey 5

我知道这是一个旧线程,但还是发布了我的答案,因为我在搜索相同场景时偶然发现了这个线程,我认为它可能对其他人有用。

IssuerSigningKeyResolver在 TokenValidationParameters 中有一个 delegate ,您可以在配置其他选项时设置它。在每次请求身份验证时,您的委托都会被执行。您可以动态返回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 };
                }

            };

        });
Run Code Online (Sandbox Code Playgroud)

  • 蟾蜍,你在这里破坏 DI 是错误的。我们在这里的“Startup.cs”中。从 DI 的角度来看,“Startup.cs”就是 DI 中所谓的“组合根”。因此,这是应用程序中您可以(并且通常必须)直接引用内容的地方。(例如,为应用程序的其余部分注册它们。) (2认同)