.NET 6使用Azure AD客户端凭据时遇invalid_token问题
排查建议
以下是针对该问题的具体排查步骤:
检查客户端应用的API权限配置
客户端凭据模式依赖应用权限(而非授权码模式的委托权限)。需确认:- 在客户端应用注册的「API权限」板块,添加了API应用的应用权限(注意区分“应用权限”和“委托权限”类别);
- 已完成管理员同意(应用权限必须由租户管理员手动同意才能生效,这是最容易遗漏的关键步骤)。
解析令牌并核对核心声明
用jwt.ms解析客户端凭据获取的令牌,重点检查:aud:是否与API应用注册的「应用ID URI」完全一致;azp:是否为客户端应用的ID;roles:是否包含API应用定义的应用权限(使用/.default范围时,令牌应包含该声明,若缺失则说明权限未正确配置);iss:是否与API配置中的租户颁发者匹配(比如https://login.microsoftonline.com/{tenantId}/v2.0或v1版本)。
检查API的验证代码配置
在Program.cs中确认AddMicrosoftIdentityWebApi的配置是否正确:- 确保appsettings.json里的
AzureAd:Audience与令牌的aud声明完全一致; - 检查是否自定义了
TokenValidationParameters,比如是否误设了ValidateActor、ValidIssuers等参数,导致应用身份令牌被拦截; - 排查控制器的授权属性:若使用了
[Authorize(Roles = "xxx")]或自定义策略,需确认这些要求是否适用于应用身份(客户端凭据模式无用户角色声明,若策略强制要求用户身份则会导致拒绝)。
- 确保appsettings.json里的
提升Kestrel日志级别获取详细信息
将日志级别调整为Debug,查看完整的令牌验证流程:// appsettings.json "Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.Identity.Web": "Debug" } }重点关注验证过程中是否有被忽略的错误细节,比如某个声明验证失败、授权策略不匹配等。
确认客户端令牌请求端点与版本
客户端请求令牌的端点需与API支持的令牌版本匹配:- 若API应用注册使用v2端点,客户端应调用
https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token; - 若使用v1端点,调用
https://login.microsoftonline.com/{tenantId}/oauth2/token;
同时确认请求范围{api-app-id-uri}/.default的拼写完全正确。
- 若API应用注册使用v2端点,客户端应调用
内容的提问来源于stack exchange,提问作者DCripps
相关产品推荐
相关产品推荐

