为何Entra ID的common端点返回不可读访问令牌及后续问题
Entra ID多租户场景下访问令牌问题解决方案
端点行为差异原因
- common端点:作为多租户通用入口,当请求的
scope未明确指向具体受保护资源(如Microsoft Graph或自定义API)时,Entra ID会返回不透明的用户断言令牌——这类令牌并非JWT格式,仅用于获取ID令牌/刷新令牌,无法直接调用任何API。 - 租户特定v2.0端点:由于租户上下文明确,当请求包含具体资源的
scope时,Entra ID会生成针对该资源的JWT格式访问令牌,可直接用于对应API调用。
核心问题解决步骤
1. 让common端点返回可用于Graph的JWT令牌
修改SPA的scope,明确包含Microsoft Graph的委托权限,示例:
openid email offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Group.Read.All
注意:
- 需在Entra ID的SPA应用注册中,添加上述Graph委托权限,并完成管理员授权(多租户场景需全局管理员同意)。
- 此时从common端点获取的访问令牌将是JWT格式,受众为Microsoft Graph,可直接调用
https://graph.microsoft.com/v1.0/me或组查询接口。
2. 正确配置OBO流程实现Spring API调用Graph
若需Spring API作为中间层调用Graph,需按以下步骤配置:
- SPA侧:请求针对你的Spring API的自定义scope,示例:
确保该自定义scope已在Spring API的Entra ID应用注册中暴露,且SPA已授权该scope。此时SPA获取的访问令牌受众为你的API的client-id,是JWT格式。openid email offline_access api://{your-spring-api-client-id}/access_as_user - Spring API侧:使用OBO流程交换Graph访问令牌,请求参数示例:
POST https://login.microsoftonline.com/common/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer client_id={your-spring-api-client-id} client_secret={your-spring-api-client-secret} assertion={spa-access-token} scope=https://graph.microsoft.com/User.Read https://graph.microsoft.com/Group.Read.All requested_token_use=on_behalf_of - 错误AADSTS500131修复:该错误通常是因为原令牌(SPA的访问令牌)的受众不是你的API,或API未被授权进行OBO交换。需确保SPA请求的是你的API的自定义scope,且API应用注册中已正确配置权限。
3. 修正自定义scope配置问题
- 自定义scope的正确格式为
api://{your-api-client-id}/{scope-name},而非api://{myTenant}/{myScope}——租户ID不应出现在scope路径中,需替换为API的client-id。 - 若去掉
openid后得到受众为00000002-0000-0000-c000-000000000000的JWT,说明你的scope被默认映射到了Microsoft Graph,但未明确指定权限,导致令牌无法正确用于目标API。需明确指定资源的完整scope路径。
关于用户组溢出的替代方案
若ID令牌中组过多导致溢出,除了通过Graph API查询外,还可在Entra ID应用注册中配置组声明筛选,仅返回需要的安全组,减少ID令牌体积;或使用增量查询方式获取组信息。
内容的提问来源于stack exchange,提问作者John Claxton
相关产品推荐
相关产品推荐

