You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:20:03