如何让Access Token与ID Token均包含自定义声明?排查配置问题
自定义属性无法出现在Access Token的排查与解决
1. 确认自定义属性的范围配置
自定义属性(目录扩展)默认仅对ID Token生效。要让它出现在Access Token里,得满足对应条件:
- 如果属性是用户扩展属性,必须在应用的「API权限」中添加
User.Read.All(或对应自定义权限),并且完成管理员同意。 - 如果是应用扩展属性,要确保属性创建时目标对象包含应用,且权限配置正确。
2. 检查Access Token的受众与请求范围
- Access Token的
aud(受众)必须是你的应用Client ID,不能是其他API(比如Microsoft Graph)。如果请求的是Graph的令牌,自定义属性不会被包含。 - 请求令牌时,
scope参数必须包含你的应用相关范围,比如api://{你的Client ID}/.default(代表应用权限),或者自定义的scope值。不能只传openid profile这类仅生成ID Token的范围。
3. 核对Manifest的可选声明格式
确保Manifest里的optionalClaims节点同时正确配置idToken和accessToken数组,且自定义属性的名称格式准确——目录扩展的名称是extension_{去掉连字符的Client ID}_{属性名},比如Client ID是abc123-def-456,要改成abc123def456。
示例配置:
"optionalClaims": { "idToken": [ { "name": "extension_abc123def456_myCustomAttr", "essential": false } ], "accessToken": [ { "name": "extension_abc123def456_myCustomAttr", "essential": false } ] }
4. 确保权限已生效
添加权限后,必须点击「授予管理员同意」,并且等待5-10分钟让配置生效。如果是用户登录获取令牌,还要确保用户已重新登录,旧缓存令牌不会加载新配置。
5. 强制刷新令牌
旧令牌缓存会导致新配置不生效,可通过以下方式强制获取新令牌:
- 注销用户后重新登录
- 在令牌请求中添加
prompt=login参数 - 清除浏览器或客户端的令牌缓存
6. 验证令牌内容
用本地的JWT解析工具查看令牌内容,确认aud是否为你的应用Client ID,scope是否包含正确的应用范围,以及自定义属性是否存在。
内容的提问来源于stack exchange,提问作者Manjeet
相关产品推荐
相关产品推荐

