【问题标题】:Update JwtBearerOptions After Startup启动后更新 JwtBearerOptions
【发布时间】:2021-09-18 09:39:44
【问题描述】:

在我的程序中,我的 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?由于服务在ConfigureServices 中不可用,我必须在启动后进行 http 调用以获取值。

我试过了

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

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


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

【问题讨论】:

  • 嗨@Jeff B,我认为更常见的方法是将这些值存储在 appsettings.json 中,您可以通过配置获取它们。
  • @Rena 谢谢,我对大多数事情都这样做。问题是这些密钥可以在身份服务器上每天更改。如果我将这些值保留在应用程序设置中,那么每次更改时我都必须在每个应用程序上更新该值,并且整个应用程序会中断,直到进行更改为止。

标签: c# authentication jwt asp.net-core-mvc


【解决方案1】:

解决方案是改变我试图实现这一目标的方式。 无法动态设置IssuerSigningKey

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

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2020-08-30
    • 2015-01-15
    • 2017-01-11
    • 2020-01-12
    • 2019-10-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多