启动后更新 JwtBearerOptions

Update JwtBearerOptions After Startup

在我的程序中,我在启动时有 ConfigureServices 方法。

在那个函数中我有这个:

services.AddAuthentication(auth => {
  auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
  options.SaveToken = true;
  options.Events = new JwtBearerEvents() {
    OnAuthenticationFailed = c => {
      Console.WriteLine("Auth Failed");
      return Task.CompletedTask;
    }
  };
  options.TokenValidationParameters = new TokenValidationParameters {
    ValidateIssuer = true,
      ValidIssuer = AppSettings.SignInSettings.IdentityUrl,
      ValidateAudience = false,
      //ValidAudience = config.JwtToken.Audience,
      ValidateIssuerSigningKey = true,
      //IssuerSigningKeys = new JsonWebKeySet(jwks).GetSigningKeys()
  };
});

我的 IssuerSigningKeys 值是通过 .well-known/openid-configuration/jwks 从我的身份服务器获得的。

我遇到的问题是如何在启动完成后获取该值并将其设置为我的 JwtBearerOptions?我必须在启动后进行 http 调用以获取值,因为该服务在 ConfigureServices.

中不可用

我试过了

lifetime.ApplicationStarted.Register(OnApplicationStartedAsync(clientFactory, appSettings, options).Wait);

这确实让我在启动后立即获得值,但我没有看到更新配置值本身的方法。我可以通过 IOptionsMonitor<JwtBearerOptions> 检索当前值。我可以在启动的 Configure 方法中配置 JwtBearerOptions 吗?


编辑:如果可行,我会post回答,但我认为最好的解决方案是将我在身份服务器上需要的 x509 证书传播到其他应用服务器,这样我就可以在启动。

解决方案是改变我尝试完成此任务的方式。 无法动态设置 IssuerSigningKey

我最终采用的解决方案是不再担心在客户端应用程序上验证 SigningKey,而是对 API 进行自省。这是因为如果 SigningKey 在 UI 上无效,用户将一无所获。他们最多能看到通常隐藏的按钮或其他元素,但数据永远不会 return.