迁移至Azure Entra ID后Access Token验证失败,ID Token正常问题咨询
Access Token签名验证失败但ID Token正常的原因及修复方案
核心原因分析
1. Access Token受众(Audience)不匹配
Azure Entra ID中,Access Token的aud字段是后端API的客户端ID/应用ID URI,如果前端请求时指定的受众和后端验证配置的受众不一致,就会触发签名验证失败。而ID Token的aud是前端Angular应用的客户端ID,通常配置正确,所以能通过验证。
- 检查点:
- 前端MSAL的
scopes是否包含后端API的正确范围(例如api://{后端API应用ID}/.default) - 后端Spring Boot配置
spring.security.oauth2.resourceserver.jwt.audiences是否与该受众一致
- 前端MSAL的
2. Access Token指向公共Graph API
如果前端请求的是User.Read这类Microsoft Graph API的scopes,生成的Access Token是给Graph API用的,后端无法验证其签名(签名密钥属于Graph API,而非你的自定义API)。ID Token始终针对前端应用,不受此影响。
- 检查点:确认前端请求的scopes属于你的自定义后端API,而非公共Graph API的范围
3. 后端签名密钥源配置错误
Azure Entra ID的Token签名密钥来自租户的JWKS端点,但如果后端配置的JWKS地址不正确,或网络无法访问该端点,会导致无法获取正确密钥验证Access Token。ID Token的验证逻辑通常依赖相同端点,但可能因配置优先级不同而正常工作。
- 检查点:后端
spring.security.oauth2.resourceserver.jwt.jwk-set-uri是否设置为https://login.microsoftonline.com/{你的租户ID}/discovery/v2.0/keys,且网络无拦截
4. 加密算法不兼容
部分场景下,前端获取的Access Token使用了后端未支持的加密算法(如ES256),而ID Token默认使用RS256,刚好匹配后端配置。
- 检查点:
- 在Azure Entra ID的后端API应用注册中,确认“令牌配置”的签名算法为RS256
- 后端配置
spring.security.oauth2.resourceserver.jwt.jws-algorithms=RS256明确指定支持的算法
前端MSAL配置调整
确保Angular的MSAL配置中,protectedResourceMap正确映射后端API路径到对应scopes:
protectedResourceMap: new Map([ ['https://你的后端API域名/api/**', ['api://{后端API应用ID}/.default']] ])
登录或获取Token时,scopes数组必须包含后端API的范围,不能仅请求openid、profile这类ID Token相关范围。
后端Spring Boot配置示例
application.yml中的OAuth2资源服务器配置需符合以下格式:
spring: security: oauth2: resourceserver: jwt: issuer-uri: https://login.microsoftonline.com/{你的租户ID}/v2.0 audiences: api://{后端API应用ID} jwk-set-uri: https://login.microsoftonline.com/{你的租户ID}/discovery/v2.0/keys
内容的提问来源于stack exchange,提问作者Sree ragh
相关产品推荐
相关产品推荐

