如何从Azure AD B2C登录页提取邮箱地址给自定义第三方身份提供商
解决Azure AD B2C自定义提供商登录时捕获邮箱的问题
1. 定义邮箱声明
在TrustFrameworkExtensions.xml的<ClaimsSchema>中确认已定义email声明,若未定义则添加:
<ClaimsSchema> <ClaimType Id="email"> <DisplayName>邮箱地址</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> <Restriction> <Pattern>^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$</Pattern> </Restriction> </ClaimType> </ClaimsSchema>
2. 调整CombinedSignInAndSignUp编排步骤
修改编排步骤的配置,给自定义提供商的选择项添加验证用的ClaimsExchange,确保点击按钮时先收集邮箱:
<OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin"> <ClaimsProviderSelections> <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" /> <!-- 新增ValidationClaimsExchangeId,触发邮箱收集流程 --> <ClaimsProviderSelection TargetClaimsExchangeId="CustomProvider" ValidationClaimsExchangeId="CollectEmailForCustomProvider" /> <ClaimsProviderSelection TargetClaimsExchangeId="ForgotPasswordExchange" /> </ClaimsProviderSelections> <ClaimsExchanges> <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" /> <!-- 添加收集邮箱的ClaimsExchange --> <ClaimsExchange Id="CollectEmailForCustomProvider" TechnicalProfileReferenceId="SelfAsserted-CollectEmail" /> </ClaimsExchanges> </OrchestrationStep>
3. 创建收集邮箱的自我断言技术配置
在<TechnicalProfiles>节点下添加专门用于收集邮箱的配置,仅展示邮箱输入框:
<TechnicalProfile Id="SelfAsserted-CollectEmail"> <DisplayName>为自定义提供商收集邮箱</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ContentDefinitionReferenceId">api.selfasserted</Item> <Item Key="language.button_continue">继续</Item> </Metadata> <InputClaims /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" Required="true" /> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
4. 在自定义提供商技术配置中传递邮箱
修改自定义提供商对应的TechnicalProfile,将收集到的email声明作为请求参数传递给第三方提供商(以下以OIDC协议为例):
<TechnicalProfile Id="CustomProvider"> <DisplayName>自定义提供商</DisplayName> <Protocol Name="OpenIdConnect" /> <Metadata> <Item Key="client_id">你的客户端ID</Item> <Item Key="metadata">https://你的提供商地址/.well-known/openid-configuration</Item> <Item Key="response_types">code</Item> <!-- 其他提供商元数据配置 --> </Metadata> <InputClaims> <!-- 将email声明映射到提供商所需的参数,比如login_hint --> <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="login_hint" /> </InputClaims> <OutputClaims> <!-- 按需配置输出声明 --> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" /> </TechnicalProfile>
核心逻辑说明
当用户点击「使用自定义提供商登录」按钮时,系统会先触发CollectEmailForCustomProvider流程,引导用户输入邮箱;收集完成后,email声明会被传入自定义提供商的技术配置,作为请求参数发送给第三方服务,实现带邮箱的委托认证。
内容的提问来源于stack exchange,提问作者Aaron Zhong
相关产品推荐
相关产品推荐

