AAD技术问询:能否将Microsoft Graph开放扩展加入应用清单的optionalClaims?
关于Microsoft Graph开放扩展与optionalClaims的问题解答
先直接给你结论:不能直接将Microsoft Graph开放扩展配置到AD应用程序清单的optionalClaims中,下面给你详细解释原因和替代方案。
为什么开放扩展没法进optionalClaims?
你之前用AD Graph API的目录扩展能成功,是因为目录扩展属于Azure AD的架构扩展——它会被添加到用户对象的核心属性集合里,Azure AD能识别并将其作为用户属性返回在claims中。
而**Microsoft Graph开放扩展(Open Extensions)**是一种“附加存储”,它并不属于用户对象的核心属性,而是以键值对的形式嵌套在用户对象的extensions字段下。Azure AD的身份认证流程不会自动解析这个嵌套字段里的属性,所以没法通过optionalClaims配置让它直接出现在idToken或accessToken的claims中。
实现需求的两种可行方案
方案1:改用Microsoft Graph目录扩展(推荐)
既然你之前用目录扩展实现过类似需求,完全可以迁移到Microsoft Graph的目录扩展来实现,步骤和之前类似:
- 先通过Microsoft Graph API为你的应用注册一个目录扩展属性(对应
organisationId); - 在邀请新用户到Azure AD时,直接设置这个目录扩展属性的值;
- 像你之前做的那样,把这个扩展属性添加到应用清单的
optionalClaims中,示例配置如下:
(注意这里的应用ID要去掉所有横杠,和你之前AD Graph的用法一致)"optionalClaims": { "idToken": [ { "name": "extension_94dd5b3a05a1416f8481eb6713b6ba08_organisationId", "source": "user", "essential": true } ] }
这样用户登录时,这个organisationId就会直接出现在idToken的claims里,完全符合你的需求。
方案2:如果必须用开放扩展,登录后主动调用API获取
如果因为某些限制必须使用开放扩展,那只能在用户登录成功后,用获取到的accessToken调用Microsoft Graph API来读取这个属性:
- 调用接口:
GET /me/extensions/extension_<你的应用ID(无横杠)>_organisationId - 这个方式需要额外的API请求,不如目录扩展直接返回claims便捷,但也能拿到你需要的属性值。
额外小提示
- 目录扩展是全局属性,所有有相应权限的应用都能访问;开放扩展是应用专属的,只有创建它的应用(或被授权的应用)能读取。
- 如果你的
organisationId只需要在当前应用内使用,两种方案都可以;但要实现登录时自动返回claims,优先选目录扩展。
内容的提问来源于stack exchange,提问作者sensei
相关产品推荐
相关产品推荐

