多租户Azure AD应用自定义SAML声明未同步至其他租户问题咨询
问题解答
这确实是Azure AD多租户应用的默认设计行为,具体原因和解决方案如下:
为什么会出现这个情况?
单租户模式下,你在原租户(AAA)企业应用中配置的自定义声明映射,是租户级别的配置,仅对原租户内的服务主体生效。当其他租户(比如BBB)的用户首次授权你的多租户应用时,Azure AD会在BBB租户自动创建一个对应的服务主体(即你看到的企业应用),这个自动生成的服务主体不会继承原租户应用注册里的任何自定义声明规则,所以默认不会返回employeeid声明。
解决方案
1. 手动添加声明(当前可行方式)
每个授权租户的管理员,需要在自己租户的对应企业应用中,进入「单点登录>属性和声明」页面,手动添加employeeid的声明映射规则。这种方式操作简单,但需要每个租户的管理员配合完成。
2. 自动同步声明的方法
如果想避免手动操作,可以通过以下两种方式实现自动配置:
- 利用Microsoft Graph API自动配置:在应用的授权回调逻辑中,检测到新租户授权后,调用Microsoft Graph API为该租户的服务主体添加声明映射策略。需要用到的核心操作包括:
- 查询目标租户中对应应用的服务主体信息
- 创建声明映射策略并关联到该服务主体
注意:应用需要具备Application.ReadWrite.All或Directory.ReadWrite.All的应用权限,且要确保能访问目标租户的目录数据。
- 应用端自行补充属性:放弃依赖Azure AD返回声明,改为在应用收到用户身份信息后,若缺少
employeeid,直接调用Microsoft Graph API的用户信息接口获取该属性,再将其补充到用户的身份上下文里。这种方式不需要租户管理员参与,完全由应用自主处理,但需要应用具备User.Read的权限(委托或应用权限均可)。
补充说明
应用注册清单中的acceptMappedClaims设为true,仅表示允许应用使用自定义声明映射,但不会触发跨租户的声明规则同步,这点需要注意。
内容的提问来源于stack exchange,提问作者Arek Dygas
相关产品推荐
相关产品推荐

