ASP.NET Core 5使用AddJwtBearer做JWT颁发者验证时如何添加参数
解决方案
你遇到的问题是JwtBearer中间件默认会自动基于Authority字段拼接OpenID配置路径,无法直接追加B2C要求的用户流参数,你可以通过显式指定元数据地址的方式绕过自动拼接逻辑,具体修改如下:
- 修改
JwtConfig.cs的扩展方法,新增用户流参数并手动指定MetadataAddress:
public static AuthenticationBuilder AddJwtBearerConfiguration(this AuthenticationBuilder builder, string issuerBase, string audience, string userFlowId) { return builder.AddJwtBearer(options => { // 手动指定完整的OpenID配置元数据地址,中间件将不再自动拼接路径 options.MetadataAddress = $"{issuerBase.TrimEnd('/')}/.well-known/openid-configuration?p={userFlowId}"; options.Audience = audience; options.TokenValidationParameters = new TokenValidationParameters() { ClockSkew = TimeSpan.FromSeconds(30), // 如需显式指定颁发者可打开下方注释,值要和你B2C用户流返回的颁发者一致 // ValidIssuer = $"https://<blade_id>.b2clogin.com/{tenantId}/v2.0/" }; // 原有挑战处理代码保留 ... }); }
- 修改
Startup.cs中的调用逻辑,传入你的用户流ID:
public void ConfigureServices(IServiceCollection services) { ... services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearerConfiguration( "https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/", "<audience_id>", "B2C_1_ropc" // 替换为你实际使用的用户流ID ); ... }
原理说明
只要显式给MetadataAddress赋值,JwtBearer中间件就会跳过自动拼接OpenID配置路径的逻辑,直接使用你传入的完整地址拉取验证用的公钥等配置,自动携带用户流参数,即可解决IDX20803报错问题。
内容的提问来源于stack exchange,提问作者Will Sutton
相关产品推荐
相关产品推荐

