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

Azure AD B2C自定义策略问题:Graph API获取用户组返回异常

问题分析

当前配置调用Graph API获取用户组时,返回的groups声明是原始JSON对象的字符串形式,而非期望的组ID/名称集合,Postman中显示的System.Collections.Generic.List1[System.String]`是集合类型未正确序列化的表现。核心原因是未正确指定JSON路径来提取组的具体字段,而是直接将整个组对象映射到了字符串集合声明。

修复步骤

1. 优化Graph API请求(可选)

添加/microsoft.graph.group过滤,确保只返回组对象,避免混入其他目录对象:

<Metadata>
  <Item Key="ServiceUrl">https://graph.microsoft.com/v1.0/users/{objectId}/transitiveMemberOf/microsoft.graph.group?$select=id,displayName</Item>
</Metadata>

2. 正确映射JSON路径到声明

根据需求选择以下场景配置:

场景1:提取组ID到字符串集合

直接通过value.id路径提取所有组的ID:

<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="value.id" />
</OutputClaims>

场景2:提取组显示名称到字符串集合

同理,提取displayName字段:

<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="value.displayName" />
</OutputClaims>

场景3:自定义组合组ID与名称

若需要同时保存ID和名称(如id|displayName格式),需添加声明转换:

  1. 定义临时声明类型:
<ClaimType Id="groupCombined">
  <DisplayName>Combined Group ID and Name</DisplayName>
  <DataType>string</DataType>
</ClaimType>
<ClaimType Id="groupId">
  <DisplayName>Group ID</DisplayName>
  <DataType>string</DataType>
</ClaimType>
<ClaimType Id="groupName">
  <DisplayName>Group Name</DisplayName>
  <DataType>string</DataType>
</ClaimType>
  1. 修改技术配置的输出声明与转换:
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="groupId" PartnerClaimType="value.id" />
  <OutputClaim ClaimTypeReferenceId="groupName" PartnerClaimType="value.displayName" />
</OutputClaims>
<OutputClaimsTransformations>
  <OutputClaimsTransformation ReferenceId="CombineGroupInfo" />
  <OutputClaimsTransformation ReferenceId="AddCombinedGroupToCollection" />
  <OutputClaimsTransformation ReferenceId="CheckIfMemberOfAllowGroup" />
</OutputClaimsTransformations>
  1. 添加对应的声明转换定义:
<ClaimsTransformation Id="CombineGroupInfo" TransformationMethod="FormatStringClaim">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="groupId" TransformationClaimType="inputClaim1" />
    <InputClaim ClaimTypeReferenceId="groupName" TransformationClaimType="inputClaim2" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="stringFormat" Value="{0}|{1}" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="groupCombined" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

<ClaimsTransformation Id="AddCombinedGroupToCollection" TransformationMethod="AddItemToStringCollection">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="groupCombined" TransformationClaimType="item" />
    <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="collection" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="groups" TransformationClaimType="collection" />
  </OutputClaims>
</ClaimsTransformation>

3. 保留关键元数据配置

确保ResolveJsonPathsInJsonTokens保持true,允许B2C解析嵌套JSON路径:

<Item Key="ResolveJsonPathsInJsonTokens">true</Item>
验证结果

修改完成后,Token中的groups将变为纯字符串数组,示例:

"groups": [
  "3bae6asfjkhs",
  "certified"
]

或自定义组合格式,不再包含原始JSON对象字符串,Postman也会显示正确的JSON数组格式。

内容的提问来源于stack exchange,提问作者M. Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:50:09