【问题标题】:ASP.NET Core - change JWT SecurityKey during runtimeASP.NET Core - 在运行时更改 JWT SecurityKey
【发布时间】:2019-06-07 14:53:39
【问题描述】:

有类似这样的配置:

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 并执行与上一点类似的操作

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

【问题讨论】:

    标签: asp.net-core jwt


    【解决方案1】:

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

    在 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 };
                    }
    
                };
    
            });
    

    【讨论】:

    • 谢谢,这是一个很好的答案,但不幸的是,此委托需要具体代码并且无法使用服务来获取密钥,例如通过注入服务使用 Azure Key Vault。我们可以在这里编写密钥检索代码,但这会破坏 DI 的全部意义。
    • 蟾蜍,你在这里打破 DI 是错误的。我们在“Startup.cs”这里。从 DI 的角度来看,“Startup.cs”是 DI 中所谓的“组合根”。因此,这是应用程序中您可以(而且经常必须)直接引用事物的地方。 (例如,为应用程序的其余部分注册它们。)
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2019-02-02
    • 2019-03-23
    • 2021-02-14
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多