Azure B2C自定义策略中如何拆分StringCollection类型声明?
解决方案:Azure B2C自定义策略中拆分StringCollection声明
Azure B2C内置的StringCollection类型声明转换确实没有直接支持批量拆分的操作,要实现将一个大的StringCollection拆分为多个固定元素数的子集合,最可行的方案是借助自定义REST API ClaimTransformation来完成,以下是具体实现步骤:
1. 编写拆分逻辑的REST API
你需要开发一个简单的REST服务,接收两个核心参数:
- 原始的StringCollection声明值(比如
myclaim对应的数组) - 每个子集合允许的最大元素数
N
API的核心逻辑是将输入数组按每N个元素一组拆分,生成多个子数组,再以键值对形式返回,键名采用myclaim_0、myclaim_1这类格式。
示例API逻辑(C#伪代码)
[HttpPost] public IActionResult SplitStringCollection([FromBody] SplitRequest request) { var result = new Dictionary<string, string[]>(); var items = request.MyClaim; int batchSize = request.BatchSize; for (int i = 0; i < items.Length; i += batchSize) { var batch = items.Skip(i).Take(batchSize).ToArray(); result.Add($"myclaim_{i/batchSize}", batch); } return Ok(result); } public class SplitRequest { public string[] MyClaim { get; set; } public int BatchSize { get; set; } }
2. 在Azure B2C自定义策略中配置REST API集成
2.1 添加RESTful技术配置
在策略的<ClaimsProviders>节点下添加REST API的访问配置,务必做好安全校验(比如使用API密钥):
<ClaimsProvider> <DisplayName>REST API Split StringCollection</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="REST-SplitStringCollection"> <DisplayName>Split StringCollection into batches</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://your-api-domain.com/api/SplitStringCollection</Item> <Item Key="AuthenticationType">ApiKey</Item> <Item Key="SendClaimsIn">Body</Item> </Metadata> <CryptographicKeys> <Key Id="ApiKey" StorageReferenceId="B2C_1A_RestApiKey" /> </CryptographicKeys> <InputClaims> <InputClaim ClaimTypeReferenceId="myclaim" PartnerClaimType="MyClaim" /> <InputClaim ClaimTypeReferenceId="batchSize" PartnerClaimType="BatchSize" DefaultValue="2" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="myclaim_0" PartnerClaimType="myclaim_0" /> <OutputClaim ClaimTypeReferenceId="myclaim_1" PartnerClaimType="myclaim_1" /> <OutputClaim ClaimTypeReferenceId="myclaim_2" PartnerClaimType="myclaim_2" /> <!-- 根据预估的最大拆分数量,提前定义足够多的输出声明 --> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
2.2 声明类型定义
在<BuildingBlocks>的<ClaimsSchema>节点中,定义输入和输出的声明类型:
<ClaimsSchema> <ClaimType Id="myclaim"> <DisplayName>Original StringCollection</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <ClaimType Id="batchSize"> <DisplayName>Batch Size per Collection</DisplayName> <DataType>int</DataType> </ClaimType> <ClaimType Id="myclaim_0"> <DisplayName>Split Collection 0</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <ClaimType Id="myclaim_1"> <DisplayName>Split Collection 1</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <ClaimType Id="myclaim_2"> <DisplayName>Split Collection 2</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <!-- 按需添加更多拆分后的声明类型 --> </ClaimsSchema>
2.3 在用户旅程中添加转换步骤
在用户旅程的<UserJourney>节点下,找到合适的步骤(比如获取上游OIDC声明之后、发送给下游应用之前),添加调用上述REST技术配置的步骤:
<UserJourney Id="SignUpOrSignIn"> <!-- 其他已有的流程步骤 --> <OrchestrationStep Order="X" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="SplitStringCollectionExchange" TechnicalProfileReferenceId="REST-SplitStringCollection" /> </ClaimsExchanges> </OrchestrationStep> <!-- 后续发送声明给下游应用的步骤 --> </UserJourney>
3. 关键注意事项
- 声明数量预估:需要根据原始StringCollection的最大可能元素数,提前定义足够多的输出声明(比如如果最多有10个元素、每个子集合2个,就需要定义到
myclaim_4),避免数据遗漏。 - API安全:务必配置API密钥或IP白名单,确保只有Azure B2C可以调用你的REST API,防止未授权访问。
- 错误处理:可以在REST技术配置中添加
<Metadata>项配置错误处理策略,比如<Item Key="AllowInsecureAuthInProduction">false</Item>,以及设置RetryPolicy应对临时网络问题。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

