Azure AD B2C自定义策略中如何引入"字符实现声明转换检查
Azure AD B2C自定义策略:检查字符串集合是否包含指定子串(含引号转义)
核心要点:引号的XML转义
在Azure AD B2C自定义策略的XML配置中,双引号(")必须转义为",所以你要匹配的目标子串/"id/" /"guid/",在配置里需要写成:/"id/" /"guid/"
实现步骤:声明转换配置
1. 定义所需声明类型
首先在<ClaimsSchema>中声明用到的集合、临时结果和最终结果类型:
<ClaimsSchema> <!-- 你的源字符串集合 --> <ClaimType Id="MyStringCollection"> <DisplayName>源字符串集合</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <!-- 临时存储单个元素的匹配结果 --> <ClaimType Id="IsMatch"> <DisplayName>单个元素匹配结果</DisplayName> <DataType>boolean</DataType> </ClaimType> <!-- 存储所有元素的匹配结果集合 --> <ClaimType Id="MatchResults"> <DisplayName>所有匹配结果集合</DisplayName> <DataType>booleanCollection</DataType> </ClaimType> <!-- 最终结果:是否存在匹配元素 --> <ClaimType Id="HasMatchingString"> <DisplayName>是否存在匹配元素</DisplayName> <DataType>boolean</DataType> </ClaimType> </ClaimsSchema>
2. 编写声明转换逻辑
在<ClaimsTransformations>中定义三个转换步骤:检查单个元素、遍历集合、聚合结果:
<ClaimsTransformations> <!-- 检查单个字符串是否包含目标子串 --> <ClaimsTransformation Id="CheckSingleStringMatch" TransformationMethod="StringContains"> <InputClaims> <!-- ForEach循环会自动将集合中的每个元素传入item声明 --> <InputClaim ClaimTypeReferenceId="item" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <!-- 转义后的目标子串 --> <InputParameter Id="contains" DataType="string" Value="/"id/" /"guid/"" /> <!-- 可选:是否忽略大小写,按需设置 --> <InputParameter Id="ignoreCase" DataType="boolean" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="IsMatch" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 遍历字符串集合,对每个元素执行单个匹配检查 --> <ClaimsTransformation Id="LoopThroughCollection" TransformationMethod="ForEach"> <InputClaims> <InputClaim ClaimTypeReferenceId="MyStringCollection" TransformationClaimType="collection" /> </InputClaims> <InputParameters> <InputParameter Id="ClaimsTransformationReferenceId" DataType="string" Value="CheckSingleStringMatch" /> <InputParameter Id="LoopOutputClaimName" DataType="string" Value="IsMatch" /> <InputParameter Id="LoopOutputClaimType" DataType="string" Value="booleanCollection" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="MatchResults" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 聚合所有匹配结果:只要有一个元素匹配,最终结果为true --> <ClaimsTransformation Id="AggregateMatchResults" TransformationMethod="BooleanOr"> <InputClaims> <InputClaim ClaimTypeReferenceId="MatchResults" TransformationClaimType="inputClaim" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="HasMatchingString" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
3. 在技术配置文件中调用转换
创建一个技术配置文件来串联这些转换步骤,方便在用户旅程中调用:
<TechnicalProfile Id="CheckStringCollectionProfile"> <DisplayName>检查字符串集合匹配情况</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <InputClaims> <InputClaim ClaimTypeReferenceId="MyStringCollection" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="HasMatchingString" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="LoopThroughCollection" /> <OutputClaimsTransformation ReferenceId="AggregateMatchResults" /> </OutputClaimsTransformations> </TechnicalProfile>
使用说明
在用户旅程的<OrchestrationStep>中引入这个技术配置文件,就能得到HasMatchingString声明(布尔值),后续可根据这个值执行分支逻辑。
内容的提问来源于stack exchange,提问作者IriaAM
相关产品推荐
相关产品推荐

