You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:36