如何使用Azure AD B2C自定义策略调用多个ClaimsEndpoint
在Azure AD B2C自定义策略中使用多个ClaimsEndpoint的解决方案
没问题,Azure AD B2C自定义策略完全支持配置多个ClaimsEndpoint来获取不同来源的声明,你可以通过两种常见方式实现:
方法1:在单个Technical Profile中配置多个ClaimsEndpoint
你可以在同一个Restful类型的Technical Profile里添加多个<ClaimsEndpoint>节点,每个节点对应一个第三方API的调用,只要给每个节点分配唯一的Id即可。每个ClaimsEndpoint可以独立指定请求URL、HTTP方法、请求头、输出声明等。
示例配置如下:
<TechnicalProfile Id="MultiClaimsEndpointProfile"> <DisplayName>Get multiple claims from different APIs</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Url</Item> </Metadata> <!-- 第一个ClaimsEndpoint --> <ClaimsEndpoint Id="FirstApiEndpoint"> <Endpoint Url="https://first-api.example.com/claims" /> <HttpMethod>GET</HttpMethod> <OutputClaims> <OutputClaim ClaimTypeReferenceId="firstPartyClaim1" PartnerClaimType="external_claim_1" /> <OutputClaim ClaimTypeReferenceId="firstPartyClaim2" PartnerClaimType="external_claim_2" /> </OutputClaims> </ClaimsEndpoint> <!-- 第二个ClaimsEndpoint --> <ClaimsEndpoint Id="SecondApiEndpoint"> <Endpoint Url="https://second-api.example.com/user-details" /> <HttpMethod>POST</HttpMethod> <InputClaims> <InputClaim ClaimTypeReferenceId="userId" PartnerClaimType="user_id" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="secondPartyClaim1" PartnerClaimType="user_profile_field" /> <OutputClaim ClaimTypeReferenceId="secondPartyClaim2" PartnerClaimType="user_preference" /> </OutputClaims> </ClaimsEndpoint> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
注意事项:
- 每个
<ClaimsEndpoint>必须有唯一的Id属性,避免冲突 - 可以根据每个API的要求设置不同的
HttpMethod、InputClaims(请求参数)和OutputClaims(返回的声明映射) - 如果第三方API需要认证,可以在对应ClaimsEndpoint的
<Metadata>里配置AuthenticationType(比如Bearer)并添加<AuthenticationClaims>
方法2:链式调用多个独立的Technical Profiles
如果不同的ClaimsEndpoint逻辑差异较大(比如需要不同的认证方式、错误处理),你可以创建多个独立的Technical Profile,然后在用户旅程(User Journey)中按顺序调用它们,或者通过IncludeTechnicalProfile来链式调用。
示例1:在用户旅程中添加多个步骤
<UserJourney Id="SignUpOrSignInWithMultipleClaims"> <OrchestrationSteps> <!-- 步骤1:用户登录/注册 --> <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin"> <ClaimsProviderSelections> <ClaimsProviderSelection TargetClaimsExchangeId="FacebookExchange" /> <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" /> </ClaimsProviderSelections> <ClaimsExchanges> <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" /> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤2:调用第一个API获取声明 --> <OrchestrationStep Order="2" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="FirstApiExchange" TechnicalProfileReferenceId="FirstApiClaimsProfile" /> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤3:调用第二个API获取声明 --> <OrchestrationStep Order="3" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="SecondApiExchange" TechnicalProfileReferenceId="SecondApiClaimsProfile" /> </ClaimsExchanges> </OrchestrationStep> <!-- 后续步骤:生成B2C令牌 --> <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" /> </OrchestrationSteps> <ClientDefinition ReferenceId="DefaultWeb" /> </UserJourney>
示例2:在Technical Profile中链式调用
<TechnicalProfile Id="CombinedClaimsProfile"> <DisplayName>Chain multiple claim retrieval profiles</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.CompositeProfileProvider, Web.TPEngine" /> <IncludeTechnicalProfile ReferenceId="FirstApiClaimsProfile" /> <IncludeTechnicalProfile ReferenceId="SecondApiClaimsProfile" /> </TechnicalProfile>
这种方式的优势是每个Technical Profile职责单一,便于维护和调试,还能分别配置各自的会话管理、错误处理规则。
关键注意点
- 确保所有获取到的声明都在
<ClaimSchema>中定义过,否则无法映射到B2C令牌 - 如果需要将这些第三方声明包含在最终的B2C令牌中,要在
JwtIssuerTechnical Profile的<OutputClaims>里添加对应的声明引用 - 注意API调用的性能,避免过多的ClaimsEndpoint导致用户旅程延迟过长
内容的提问来源于stack exchange,提问作者V. G.
相关产品推荐
相关产品推荐

