如何在Custom Policies中生成含带点属性的JSON?是否可行?
Azure AD B2C自定义策略生成目标嵌套JSON格式的问题解答
结论
可以生成目标格式的嵌套JSON,但无法通过单个GenerateJson转换直接实现,需要通过多步骤ClaimsTransformation组合构建。
原因
Azure AD B2C的GenerateJson转换中,InputParameter的Id字段仅会被当作JSON的顶级键名处理,不支持通过冒号(:)或点号(.)语法直接解析为嵌套结构。你当前的代码会把something:abc.0:user.property完整作为一个平级键,因此生成的是{"something:abc.0:user.property": "value"}这种不符合预期的JSON。
解决方法:多步骤组合生成嵌套结构
要构建嵌套JSON,需要分层创建各层级的JSON对象,再逐层组合:
1. 定义所需的Claim类型
首先在策略的<ClaimSchema>中添加用于存储各层级JSON的字符串类型Claim:
<ClaimSchema> <ClaimType Id="userPropertyJson"> <DisplayName>User Property JSON</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="userJson"> <DisplayName>User JSON</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="abcJson"> <DisplayName>ABC JSON</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="finalRequestBody"> <DisplayName>Final Request Body JSON</DisplayName> <DataType>string</DataType> </ClaimType> </ClaimSchema>
2. 分层创建ClaimsTransformation
通过多个GenerateJson转换逐层构建嵌套结构:
<!-- 步骤1:生成最内层 {"property": "value"} --> <ClaimsTransformation Id="GenerateUserPropertyJson" TransformationMethod="GenerateJson"> <InputParameters> <InputParameter Id="property" DataType="string" Value="value" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="userPropertyJson" TransformationClaimType="outputJson" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤2:生成 {"user": [{"property": "value"}]} --> <ClaimsTransformation Id="GenerateUserJson" TransformationMethod="GenerateJson"> <InputClaims> <InputClaim ClaimTypeReferenceId="userPropertyJson" TransformationClaimType="user.0" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="userJson" TransformationClaimType="outputJson" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤3:生成 {"abc": [{"user": {"property": "value"}}]} --> <ClaimsTransformation Id="GenerateAbcJson" TransformationMethod="GenerateJson"> <InputClaims> <InputClaim ClaimTypeReferenceId="userJson" TransformationClaimType="abc.0" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="abcJson" TransformationClaimType="outputJson" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤4:生成最终目标JSON {"something": {"abc": [{"user": {"property": "value"}}]}} --> <ClaimsTransformation Id="GenerateAMNotificationRequestBody" TransformationMethod="GenerateJson"> <InputClaims> <InputClaim ClaimTypeReferenceId="abcJson" TransformationClaimType="something" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="finalRequestBody" TransformationClaimType="outputJson" /> </OutputClaims> </ClaimsTransformation>
关键说明
- 每个
GenerateJson负责构建一层嵌套结构,通过InputClaims引用上一步生成的JSON Claim。 - 使用
TransformationClaimType="键名.索引"的格式可以生成数组结构,比如user.0表示user数组的第一个元素。
内容的提问来源于stack exchange,提问作者Deepak Thakur
相关产品推荐
相关产品推荐

