如何在 ASP.NET Core 运行时动态更新 JWT 身份验证中的 ValidAudiences?

问题描述 投票:0回答:1

我正在开发一个 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();
}}
asp.net-core authentication jwt authorization
1个回答
0
投票

是的,您可以使用 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
的任何更改都将立即生效。

© www.soinside.com 2019 - 2024. All rights reserved.