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

ASP.NET Core 6 API配置Azure AD令牌验证遇invalid_token错误求助

解决ASP.NET Core 6 Azure AD令牌验证失败(invalid_token)问题

问题分析

你的代码核心问题在于令牌验证时机错误,同时存在硬编码配置、重复设置验证参数的问题:

  1. OnTokenValidated事件修改验证参数无效:该事件是在令牌完成验证流程后触发的,此时修改TokenValidationParameters不会对当前令牌的验证产生任何作用,相当于你的自定义验证规则根本没生效。
  2. 硬编码租户/客户端ID:直接写死MY-TENANT-ID和MY-CLIENT-ID,未读取配置文件,容易和实际令牌的颁发者、受众不匹配。
  3. 重复配置冲突:AddMicrosoftIdentityWebApi已经会根据配置文件自动设置验证参数,手动重复配置可能引发逻辑冲突。

解决方案

1. 确保配置文件正确(appsettings.json)

先确认AzureAd节点配置和你的Azure AD应用注册信息一致:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "你的实际租户ID",
    "ClientId": "你的API客户端ID"
  }
}

2. 修改Program.cs配置逻辑

将验证参数的配置移到事件外,直接在Configure<JwtBearerOptions>中设置,仅在OnTokenValidated中处理验证后的额外逻辑:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
    // 从配置文件读取参数,避免硬编码
    var azureAdConfig = builder.Configuration.GetSection("AzureAd").Get<AzureAdOptions>();
    string tenantId = azureAdConfig.TenantId;
    string clientId = azureAdConfig.ClientId;

    // 直接配置令牌验证参数,这会在验证流程生效前生效
    options.TokenValidationParameters.ValidIssuers = new List<string>()
    {
        $"https://login.microsoftonline.com/{tenantId}/",
        $"https://login.microsoftonline.com/{tenantId}/v2.0",
        $"https://login.windows.net/{tenantId}/",
        $"https://login.microsoft.com/{tenantId}/",
        $"https://sts.windows.net/{tenantId}/"
    };

    options.TokenValidationParameters.ValidAudiences = new List<string>()
    {
        $"api://{clientId}",
        clientId
    };

    // 以下参数默认已为true,无需重复设置(除非你主动修改过)
    // options.TokenValidationParameters.ValidateLifetime = true;
    // options.TokenValidationParameters.ValidateIssuer = true;
    // options.TokenValidationParameters.ValidateAudience = true;

    // 仅在需要验证后做额外操作时使用OnTokenValidated,比如添加自定义声明
    var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
    options.Events.OnTokenValidated = async context =>
    {
        await existingOnTokenValidatedHandler(context);

        // 示例:添加自定义用户声明
        // var identity = context.Principal.Identity as ClaimsIdentity;
        // identity?.AddClaim(new Claim("custom-claim", "custom-value"));
    };
});

3. 额外检查项

  • 用jwt.io解析你在Insomnia中使用的令牌,确认aud(受众)在配置的ValidAudiences列表中,iss(颁发者)在ValidIssuers列表中。
  • 检查令牌是否过期,ValidateLifetime默认开启,过期令牌会被直接拒绝。
  • 确保Azure AD应用注册中,API的范围已正确配置,客户端请求令牌时已请求对应范围。

内容的提问来源于stack exchange,提问作者Rafael Estevão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:10:33