如何在B2C自定义策略中配置指定逻辑的布尔声明转换?
在B2C自定义策略中实现布尔声明的条件转换
要实现当声明x为true时将y设为false,否则保留y原值的逻辑,你可以通过以下步骤配置声明转换和编排控制:
1. 声明定义(ClaimsSchema)
首先确保在策略的<ClaimsSchema>节点中定义好两个布尔声明:
<ClaimsSchema> <ClaimType Id="x"> <DisplayName>Boolean X</DisplayName> <DataType>boolean</DataType> </ClaimType> <ClaimType Id="y"> <DisplayName>Boolean Y</DisplayName> <DataType>boolean</DataType> </ClaimType> </ClaimsSchema>
2. 配置声明转换逻辑
在<ClaimsTransformations>节点中添加转换规则,使用SetClaimIfConditionEquals方法实现条件赋值:
<ClaimsTransformations> <ClaimsTransformation Id="SetYToFalseWhenXIsTrue" TransformationMethod="SetClaimIfConditionEquals"> <!-- 输入声明:要判断的x --> <InputClaims> <InputClaim ClaimTypeReferenceId="x" TransformationClaimType="inputClaim" /> </InputClaims> <!-- 条件参数:当x等于true时执行赋值 --> <InputParameters> <InputParameter Id="conditionValue" DataType="boolean" Value="true" /> <InputParameter Id="outputClaimValue" DataType="boolean" Value="false" /> </InputParameters> <!-- 输出声明:修改后的y --> <OutputClaims> <OutputClaim ClaimTypeReferenceId="y" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
这个转换的逻辑是:仅当x的值等于true时,才将y覆盖为false;如果x是false,y会保留原有值。
3. 在编排流程中调用转换并控制步骤执行
创建一个专门的技术配置文件(TechnicalProfile)来触发这个转换,然后在用户旅程(UserJourney)中调用它,最后通过Preconditions根据y的值控制后续步骤是否执行:
3.1 定义触发转换的技术配置文件
<TechnicalProfiles> <TechnicalProfile Id="TransformBooleanClaims"> <DisplayName>Apply Boolean Claim Transformation</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="y" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="SetYToFalseWhenXIsTrue" /> </OutputClaimsTransformations> </TechnicalProfile> </TechnicalProfiles>
3.2 在用户旅程中集成并控制步骤
<UserJourney Id="DefaultJourney"> <OrchestrationSteps> <!-- 步骤1:获取初始的x和y声明(比如从上游步骤或用户输入获取) --> <OrchestrationStep Order="1" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="GetInitialClaims" TechnicalProfileReferenceId="YourInitialClaimsSource" /> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤2:执行声明转换 --> <OrchestrationStep Order="2" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="TransformClaims" TechnicalProfileReferenceId="TransformBooleanClaims" /> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤3:根据转换后的y值决定是否执行此步骤 --> <OrchestrationStep Order="3" Type="ClaimsExchange"> <Preconditions> <!-- 如果y为true,则跳过此步骤 --> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>y</Value> <Value>true</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="ExecuteConditionalStep" TechnicalProfileReferenceId="YourConditionalTechnicalProfile" /> </ClaimsExchanges> </OrchestrationStep> </OrchestrationSteps> </UserJourney>
关键说明
SetClaimIfConditionEquals方法只会在条件匹配时修改目标声明,不匹配时保留原值,完美契合你的需求。- 后续步骤的
Preconditions可以根据y的最终值灵活控制执行逻辑,比如示例中当y为true时跳过步骤,你也可以根据实际需求调整判断条件和动作。
内容的提问来源于stack exchange,提问作者Lars Kolsaker
相关产品推荐
相关产品推荐

