如何在Azure AD B2C自定义策略中添加外部AD提供商的output claim 'groups'
解决Azure AD B2C中添加外部AD提供商的groups声明问题
我之前也碰到过一模一样的问题,默认配置确实不会自动把外部AD的groups拉进B2C的token里,得通过自定义策略的几个关键配置来实现,一步步来:
1. 给外部AD的应用注册配置权限
首先得确保你在外部AD里创建的那个应用注册有读取用户组的权限:
- 登录外部AD的Azure门户,找到对应的应用注册
- 转到「API权限」,添加权限,选择「Microsoft Graph」→「委托权限」
- 找到
Directory.Read.All权限并勾选,然后点击「授予管理员同意」(这个必须做,否则登录时拿不到组数据)
2. 在自定义策略里定义groups声明
打开你的自定义策略文件(比如TrustFrameworkExtensions.xml),找到<ClaimsSchema>节点,添加groups声明的定义:
<ClaimsSchema> <!-- 其他现有声明 --> <ClaimType Id="groups"> <DisplayName>User Groups</DisplayName> <DataType>stringCollection</DataType> <UserHelpText>The list of groups the user belongs to in the external AD.</UserHelpText> </ClaimType> </ClaimsSchema>
这里用stringCollection类型是因为用户可能属于多个组,这样能返回数组格式。
3. 修改外部AD的TechnicalProfile配置
找到你之前配置的外部AD对应的<TechnicalProfile>(通常ID是类似AAD-Common或者你自定义的名称),做两个修改:
3.1 添加Graph API获取组的元数据
在<Metadata>节点里添加GetUserInfoEndpoint,指定调用Graph API获取用户组的端点:
<Metadata> <!-- 现有元数据,比如ClientId、TenantId等 --> <Item Key="GetUserInfoEndpoint">https://graph.microsoft.com/v1.0/me/memberOf</Item> </Metadata>
如果需要获取嵌套组(用户所属组的子组),把端点改成https://graph.microsoft.com/v1.0/me/transitiveMemberOf
3.2 添加输出声明和转换
在<OutputClaims>里添加groups的映射,同时如果需要提取组ID或名称,添加声明转换:
<OutputClaims> <!-- 现有输出声明,比如displayName、email等 --> <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="value" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="ExtractGroupIds" /> </OutputClaimsTransformations>
4. 添加声明转换规则
如果返回的组数据是完整的对象(包含id、displayName等字段),需要把我们需要的字段提取出来。在<ClaimsTransformations>节点里添加:
<ClaimsTransformations> <!-- 提取组ID的转换 --> <ClaimsTransformation Id="ExtractGroupIds" TransformationMethod="GetSingleItemFromJsonArray"> <InputClaims> <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="inputJson" /> </InputClaims> <InputParameters> <InputParameter Id="query" DataType="string" Value="$.id" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="groups" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
如果需要提取组名称,把$.id改成$.displayName就行。
最后测试要点
- 保存并上传修改后的自定义策略到B2C租户
- 发起登录流程,用外部AD的用户登录后,拿返回的JWT token去解码(比如用jwt.io),检查里面是否包含
groups字段 - 如果遇到权限错误,再确认应用注册的
Directory.Read.All权限是否已经授予管理员同意,并且是委托权限(不是应用权限)
内容的提问来源于stack exchange,提问作者Mutex
相关产品推荐
相关产品推荐

