我正在尝试配置我的Jwt Bearer发行者密钥,但通常在生产中,我使用由KeyManager
包装的Azure Key Vault。
KeyManager
类已在依赖注入中进行了配置,但是在ConfigureServices
方法中我无法使用它(显然),但如果我不能使用它,我将无法检索到我的密钥。
目前我的解决方案是构建一个临时服务提供程序并使用它,但我认为这不是最先进的技术(而且我需要创建单例的两个副本,不太好)。
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
ServiceProvider sp = services.BuildServiceProvider();
IKeyManager keyManager = sp.GetService<KeyManager>();
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = keyManager.GetSecurityKeyFromName("jwt").Result,
ValidIssuer = "https://api.example.com",
ValidateIssuer = true
};
options.Audience = "https://api.example.com";
options.Authority = "https://api.example.com";
options.SaveToken = true;
});
KeyManager
是你自己的实现,你对它有完全的控制权。由于BuildServiceProvider
是一个昂贵的操作,你可以考虑将KeyManager
的功能转换为扩展方法。另外,keyManager.GetSecurityKeyFromName("jwt").Result
是一个异步方法吗?如果是这样,那么使用.Result
的方式是不正确的。 - Kosala W