Microsoft Entra ID:已设accessTokenAcceptedVersion为2仍获取v1令牌
问题:Microsoft Entra ID OAuth2集成中,设置
accessTokenAcceptedVersion=2仍收到v1访问令牌 问题背景
为租户专用应用注册配置OAuth2集成,已在应用清单中设置accessTokenAcceptedVersion为2,但通过v2授权/令牌端点获取的访问令牌仍是版本1,且aud值为00000003-0000-0000-c000-000000000000(对应Microsoft Graph),ID令牌则是版本2。授权请求如下:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?scope=openid+profile+email&response_type=code&client_id={client-id}&redirect_uri={redirect-uri}&state={state}&code_challenge={code-challenge}&code_challenge_method=S256
核心原因
accessTokenAcceptedVersion配置仅对针对你的应用/自定义API颁发的访问令牌生效,而你当前请求的scope只有openid、profile、email——这些是ID令牌的标准范围,此时返回的访问令牌实际是用于Microsoft Graph的(因为未指定自定义应用的权限范围),这类令牌的版本由Microsoft Graph服务控制,不受你应用的配置影响。
解决方案
1. 获取针对自身应用的v2访问令牌
如果你的目标是获取用于访问自己应用/API的v2令牌,需要修改授权请求的scope,添加你应用的自定义权限范围:
- 格式为
api://{client-id}/{scope-name},例如你的应用暴露了access_as_user权限,就添加api://your-client-id/access_as_user - 修改后的授权URL示例:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?scope=openid+profile+email+api%3A%2F%2F{client-id}%2Faccess_as_user&response_type=code&client_id={client-id}&redirect_uri={redirect-uri}&state={state}&code_challenge={code-challenge}&code_challenge_method=S256 - 确保你的应用注册中已正确暴露API并定义了对应的权限(在"API权限"->"添加权限"->"我的API"中选择自己的应用)。
2. 获取Microsoft Graph的v2访问令牌
如果确实需要Graph的v2令牌,需使用v2端点的权限格式(而非v1的完整URL格式):
- 例如使用
User.Read代替https://graph.microsoft.com/User.Read,将这类Graph权限添加到scope中 - 大部分Graph新权限会返回v2令牌,少数旧权限可能仍返回v1,可通过
jwt.ms解析令牌确认版本。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

