ASP.NET Core 6 API配置Azure AD令牌验证遇invalid_token错误求助
解决ASP.NET Core 6 Azure AD令牌验证失败(invalid_token)问题
问题分析
你的代码核心问题在于令牌验证时机错误,同时存在硬编码配置、重复设置验证参数的问题:
- OnTokenValidated事件修改验证参数无效:该事件是在令牌完成验证流程后触发的,此时修改
TokenValidationParameters不会对当前令牌的验证产生任何作用,相当于你的自定义验证规则根本没生效。 - 硬编码租户/客户端ID:直接写死
MY-TENANT-ID和MY-CLIENT-ID,未读取配置文件,容易和实际令牌的颁发者、受众不匹配。 - 重复配置冲突:
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
相关产品推荐
相关产品推荐

