我正在开发一个 ASP.NET Core 应用程序,该应用程序使用 JWT(JSON Web 令牌)进行身份验证和授权。 当前实施:
我已设置 JWT 身份验证并配置 ValidAudiences 参数来验证受众声明。 具体挑战:
我想通过 API 端点在运行时动态更新 ValidAudiences 列表,但我不确定如何实现这一点,以便更改反映在 JWT 中间件中,而无需重新启动应用程序。 问题:
如何在运行时有效更新 ValidAudiences,以便 JWT 中间件识别后续请求的新值? 环境:
我使用的是 ASP.NET Core 版本 8。 任何有关如何实现这一目标的指导或建议将不胜感激!
使用 IOptionsMonitor:
我实现了 IOptionsMonitor 来动态更新 ValidAudiences,但我不确定如何确保 JWT 中间件立即获取这些更改。 创建更新端点:
我创建了一个控制器端点,旨在更新 ValidAudiences 列表,但在确保后续请求的身份验证中间件能够识别更新的受众方面,我面临着挑战。 我的期望: 我预计在调用更新端点后,对 ValidAudiences 的更改将立即反映在 JWT 中间件中,从而允许正确验证新受众的令牌,而无需重新启动应用程序。
public class Startup {
public void ConfigureServices(IServiceCollection services)
{
services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")),
ValidateIssuer = true,
ValidIssuer = "your_issuer",
ValidateAudience = true,
ValidAudiences = // How can I dynamically set this?
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
services.AddControllers();
}}
是的,您可以使用 IOptionsMonitor 来实现此目的,如下所示。
[HttpGet("change")]
public void Change()
{
var serviceProvider = HttpContext.RequestServices;
var jwtoptionsMonitor = serviceProvider.GetService<IOptionsMonitor<JwtBearerOptions>>();
var jwtoptions = jwtoptionsMonitor.Get(JwtBearerDefaults.AuthenticationScheme);
jwtoptions.TokenValidationParameters.ValidAudiences = new[] { "newAudientce"};
}
从选项监视器解决的对此
jwtoptions
的任何更改都将立即生效。