B2C自定义策略声明转换:如何将输出声明设为stringCollection?
问题描述
需要从身份提供商(IdP)获取stringCollection类型的组声明,根据用户的组成员身份为其分配一个或多个角色,最终输出hooli.roles为stringCollection类型(作为列表使用)。但检查了SetClaimIfBooleansMatch、SetClaimsIfRegexMatch、SetClaimsIfStringsMatch等转换方法,均不支持直接输出stringCollection类型声明。目前尝试的两步转换流程只能生成string类型的hooli.roles,无法满足列表需求。
尝试的转换代码如下:
<ClaimType Id="groups"> <DisplayName>Security groups</DisplayName> <DataType>stringCollection</DataType> <DefaultPartnerClaimTypes> <Protocol Name="SAML2" PartnerClaimType="http://schemas.microsoft.com/ws/2008/06/identity/claims/groups" /> </DefaultPartnerClaimTypes> </ClaimType> <ClaimType Id="hooli.role.analyst"> <DisplayName>Hooli Role - Analyst</DisplayName> <DataType>boolean</DataType> </ClaimType> <ClaimType Id="hooli.roles"> <DisplayName>Hooli Roles</DisplayName> <DataType>string</DataType> </ClaimType> <!-- Step #1 --> <ClaimsTransformation Id="SethooliRole.Analyst" TransformationMethod="StringCollectionContains"> <InputClaims> <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="item" DataType="string" Value="Analyst Group" /> <InputParameter Id="ignoreCase" DataType="string" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.role.analyst" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> <!-- Step #2 --> <ClaimsTransformation Id="ishooliRole.Analyst" TransformationMethod="SetClaimIfBooleansMatch"> <InputClaims> <InputClaim ClaimTypeReferenceId="hooli.role.analyst" TransformationClaimType="claimToMatch" /> </InputClaims> <InputParameters> <InputParameter Id="matchTo" DataType="string" Value="true" /> <InputParameter Id="outputClaimIfMatched" DataType="string" Value="Analyst" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.roles" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
可行解决方案
你没有遗漏核心转换方法,只需结合AddItemToStringCollection就能实现多角色的集合输出,具体步骤如下:
1. 修改声明类型定义
首先将hooli.roles的DataType改为stringCollection:
<ClaimType Id="hooli.roles"> <DisplayName>Hooli Roles</DisplayName> <DataType>stringCollection</DataType> </ClaimType>
2. 添加集合转换步骤
在原有的组判断转换后,新增使用AddItemToStringCollection的转换逻辑——当boolean角色声明为true时,将对应角色值添加到hooli.roles集合中。如果有多个角色(比如Admin组),重复这套逻辑即可。
完整转换示例(包含Analyst和Admin两个角色):
<!-- 声明类型定义 --> <ClaimType Id="groups"> <DisplayName>Security groups</DisplayName> <DataType>stringCollection</DataType> <DefaultPartnerClaimTypes> <Protocol Name="SAML2" PartnerClaimType="http://schemas.microsoft.com/ws/2008/06/identity/claims/groups" /> </DefaultPartnerClaimTypes> </ClaimType> <ClaimType Id="hooli.role.analyst"> <DisplayName>Hooli Role - Analyst</DisplayName> <DataType>boolean</DataType> </ClaimType> <ClaimType Id="hooli.role.admin"> <DisplayName>Hooli Role - Admin</DisplayName> <DataType>boolean</DataType> </ClaimType> <ClaimType Id="hooli.roles"> <DisplayName>Hooli Roles</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <!-- 步骤1:判断用户是否属于Analyst组 --> <ClaimsTransformation Id="SetHooliRole_Analyst" TransformationMethod="StringCollectionContains"> <InputClaims> <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="item" DataType="string" Value="Analyst Group" /> <InputParameter Id="ignoreCase" DataType="string" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.role.analyst" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤2:判断用户是否属于Admin组 --> <ClaimsTransformation Id="SetHooliRole_Admin" TransformationMethod="StringCollectionContains"> <InputClaims> <InputClaim ClaimTypeReferenceId="groups" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="item" DataType="string" Value="Admin Group" /> <InputParameter Id="ignoreCase" DataType="string" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.role.admin" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤3:如果是Analyst,添加角色到集合 --> <ClaimsTransformation Id="AddAnalystRoleToCollection" TransformationMethod="AddItemToStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="hooli.roles" TransformationClaimType="collection" /> <InputClaim ClaimTypeReferenceId="hooli.role.analyst" TransformationClaimType="flag" /> </InputClaims> <InputParameters> <InputParameter Id="item" DataType="string" Value="Analyst" /> <InputParameter Id="checkDuplicates" DataType="string" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.roles" TransformationClaimType="collection" /> </OutputClaims> </ClaimsTransformation> <!-- 步骤4:如果是Admin,添加角色到集合 --> <ClaimsTransformation Id="AddAdminRoleToCollection" TransformationMethod="AddItemToStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="hooli.roles" TransformationClaimType="collection" /> <InputClaim ClaimTypeReferenceId="hooli.role.admin" TransformationClaimType="flag" /> </InputClaims> <InputParameters> <InputParameter Id="item" DataType="string" Value="Admin" /> <InputParameter Id="checkDuplicates" DataType="string" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="hooli.roles" TransformationClaimType="collection" /> </OutputClaims> </ClaimsTransformation>
3. 配置转换执行顺序
在用户旅程(User Journey)的ClaimsTransformation步骤中,按如下顺序执行:
- 先执行所有组判断转换(
SetHooliRole_Analyst、SetHooliRole_Admin) - 再执行所有集合添加转换(
AddAnalystRoleToCollection、AddAdminRoleToCollection)
这样就能确保符合条件的角色都会被添加到hooli.roles这个stringCollection集合中,最终输出多角色列表。
内容的提问来源于stack exchange,提问作者rkcp613
相关产品推荐
相关产品推荐

