【发布时间】: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