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格式),需添加声明转换:
- 定义临时声明类型:
<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>
- 修改技术配置的输出声明与转换:
<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>
- 添加对应的声明转换定义:
<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
相关产品推荐
相关产品推荐

