问题描述
我想执行OutputClaimsTransformation来将天蓝色广告字段值映射到SAML属性。因此,我创建了一些Claims和ClaimsTransformations。
Claim collection of type "StringCollection".
Claim output of type "String".
Claim team of type "String".
首先,我使用 AddParameterToStringCollection 添加字符串“ 123”以声明集合。 其次,我使用 LookupValue 来映射用户ClaimType字符串以声明 team 。当用户属性“ country”与“ UK”匹配时,该字符串应类似于“ 253”。第三步是将 team 添加到Claimcollection collection 。最后一步是TransformationMethed StringJoin ,使用定界符“,”(例如“ 123,253”)将集合与输出连接起来。
如果步骤2中存在映射,这将非常有用。如果不存在映射,则 AddItemToStringCollection 将“ null”添加到集合中,而 StringJoin 将导致“ 123” ”。现在,最后一个“,”必须删除。或者,我需要一种在空值上跳过 AddItemToStringCollection 的方法。
我的代码
<ClaimsTransformations>
<ClaimsTransformation Id="addGeneralToCollection" TransformationMethod="AddParameterToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="collection" TransformationClaimType="collection" />
</InputClaims>
<InputParameters>
<InputParameter Id="item" DataType="string" Value="123" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="collection" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="mapCountryToTeam" TransformationMethod="LookupValue">
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_country" TransformationClaimType="inputParameterId" />
</InputClaims>
<InputParameters>
<InputParameter Id="errorOnFailedLookup" DataType="boolean" Value="false" />
<InputParameter Id="albania" DataType="string" Value="456" />
<InputParameter Id="algeria" DataType="string" Value="789" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="team" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="joinDefaultToCountryTeam" TransformationMethod="AddItemToStringCollection">
<InputClaims>
<InputClaim ClaimTypeReferenceId="team" TransformationClaimType="item" />
<InputClaim ClaimTypeReferenceId="collection" TransformationClaimType="collection" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="collection" TransformationClaimType="collection" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="ConvertTeamCollectionToString" TransformationMethod="StringJoin">
<InputClaims>
<InputClaim ClaimTypeReferenceId="collection" TransformationClaimType="inputClaim" />
</InputClaims>
<InputParameters>
<InputParameter DataType="string" Id="delimiter" Value="," />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="output" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformations>
这对所有已定义的国家/地区都适用。但是不适用于那些在自定义字段列表中可能但没有映射的国家/地区,
编辑: 找不到映射时,这不是错误。它应该跳过这种情况。场景:我们有所有国家的清单。半数国家/地区的支持团队已弃用。现在,我想将国家/地区转换为saml响应中的代码,因此我的应用程序知道哪种支持最适合该用户。在应用程序内部,它由整数表示。此外,还有每个人都可以要求的全球支持。
因此,我想为全球团队添加一般整数,为国家相关团队添加整数(如果已定义)。如果没有,应该增加一般支持。但这不应引发错误。
我可以通过在列表中的每个国家/地区定义一般团队来解决此问题。但是,正确配置映射会更好。当它是逗号时,有没有办法缩小最后一个字符?
解决方法
基于实现,我可以想到的解决方案是对lookupValue TransformationMethod
进行以下更改outputChannel
当 errorOnFailedLookup 输入参数设置为 true 时,LookupValue声明转换始终从自声明技术配置文件调用的验证技术配置文件执行,或者一个DisplayControl。 自我声明的技术资料的 LookupNotFound 元数据控制向用户显示的错误消息。
示例自动声明的技术简介:
<InputParameter Id="errorOnFailedLookup" DataType="boolean" Value="true" />
索赔变更的技术资料:
<TechnicalProfile Id="CountryValue">
<DisplayName>Country Value</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider,Web.TPEngine,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
<Metadata>
......
<Item Key="LookupNotFound">Country Not Found</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" />
</InputClaims>
<OutputClaims>
....
<OutputClaim ClaimTypeReferenceId="output" />
</OutputClaims>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="Country-Transformation" />
</ValidationTechnicalProfiles>
</TechnicalProfile>