关闭Audience验证后MicrosoftIdentityWebApi仍验证受众的问题
关闭.NET WebAPI中Bearer令牌的Audience验证失败问题
我有一个.NET WebAPI应用,想要关闭Bearer令牌的Audience验证,但尝试的两段代码都没成功:
代码1:仍返回受众验证错误
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { }, options => { options.TenantId = azureConfig["TenantId"]; options.Instance = azureConfig["Instance"]; options.ClientId = azureConfig["ClientId"]; options.ClientSecret = azureConfig["ClientSecret"]; options.Domain = azureConfig["Domain"]; options.TokenValidationParameters.ValidateAudience = false; });
代码2:抛出空引用异常(System.Diagnostics.DiagnosticListener.Write)
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { }, options => { options.Instance = configuration.GetSection("AzureAd")["Instance"]; options.ClientId = configuration.GetSection("AzureAd")["ClientId"]; options.Domain = configuration.GetSection("AzureAd")["Domain"]; options.TenantId = configuration.GetSection("AzureAd")["TenantId"]; }); builder.Services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters.ValidateAudience = false; });
我怀疑第二段代码的问题是执行时序导致的,请问怎么才能成功关闭Audience验证?
可行解决方法
方法1:在正确的配置委托中设置
AddMicrosoftIdentityWebApi包含两个配置委托:第一个对应JwtBearerOptions(负责Bearer令牌验证规则),第二个对应MicrosoftIdentityOptions(负责Azure AD身份配置)。你之前的代码错误地在第二个委托里修改验证参数,应该在第一个委托中操作:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(jwtOptions => { // 关闭Audience验证 jwtOptions.TokenValidationParameters.ValidateAudience = false; }, microsoftOptions => { microsoftOptions.TenantId = azureConfig["TenantId"]; microsoftOptions.Instance = azureConfig["Instance"]; microsoftOptions.ClientId = azureConfig["ClientId"]; microsoftOptions.ClientSecret = azureConfig["ClientSecret"]; microsoftOptions.Domain = azureConfig["Domain"]; });
方法2:使用PostConfigure避免时序问题
如果需要后续修改配置,用PostConfigure确保在所有初始配置完成后生效,同时处理TokenValidationParameters可能未初始化的情况:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { }, options => { options.Instance = configuration.GetSection("AzureAd")["Instance"]; options.ClientId = configuration.GetSection("AzureAd")["ClientId"]; options.Domain = configuration.GetSection("AzureAd")["Domain"]; options.TenantId = configuration.GetSection("AzureAd")["TenantId"]; }); // PostConfigure会在所有Configure之后执行,确保参数已初始化 builder.Services.PostConfigure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters ??= new TokenValidationParameters(); options.TokenValidationParameters.ValidateAudience = false; });
这两种方法都能正确关闭Audience验证,解决你遇到的错误。
内容的提问来源于stack exchange,提问作者ragerory
相关产品推荐
相关产品推荐

