Azure B2C:如何在统一登录页按邮箱自动路由本地/Entra账号登录
解决方案:Azure B2C自动路由本地/Entra账号登录
针对你遇到的用户误将Entra账号凭证输入本地账号框导致报错的问题,以下是可行的实现方案,无需额外页面,直接在原有统一登录流程中完成自动路由:
1. 构建邮箱关联账号查询的技术配置文件
创建一个基于Azure AD的技术配置文件,同时查询本地账号(signInNames.emailAddress)和社交账号(emails)的邮箱关联信息,获取用户的身份提供商标识:
<ClaimsProvider> <DisplayName>Azure Active Directory</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="AAD-UserReadByEmail"> <Metadata> <Item Key="Operation">Read</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item> <Item Key="UserMessageIfClaimsPrincipalDoesNotExist"></Item> </Metadata> <IncludeInSso>false</IncludeInSso> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId" /> <OutputClaim ClaimTypeReferenceId="identityProvider" /> </OutputClaims> <IncludeTechnicalProfile ReferenceId="AAD-Common" /> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
该配置通过email作为匹配字段,同时覆盖本地账号和社交账号的邮箱存储位置,返回用户的identityProvider字段(Entra账号的标识通常为https://login.microsoftonline.com/[你的租户ID]/v2.0)。
2. 修改本地账号登录的自断言技术配置文件
调整SelfAsserted-LocalAccountSignin-Email,添加前置验证逻辑:先查询用户身份,若为Entra账号则自动跳转至Entra登录流程,否则继续本地账号密码验证:
<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email"> <DisplayName>Local Account Signin</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="UserMessageIfClaimsPrincipalDoesNotExist">Invalid credentials</Item> </Metadata> <IncludeInSso>false</IncludeInSso> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInName" Required="true" /> <OutputClaim ClaimTypeReferenceId="password" Required="true" /> </OutputClaims> <ValidationTechnicalProfiles> <!-- 前置查询用户身份信息 --> <ValidationTechnicalProfile ReferenceId="AAD-UserReadByEmail"> <Preconditions> <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> <Value>identityProvider</Value> <Action>SkipThisValidationTechnicalProfile</Action> </Precondition> </Preconditions> </ValidationTechnicalProfile> <!-- 若为Entra账号,跳转至Entra登录 --> <ValidationTechnicalProfile ReferenceId="AADCommon-OpenIdConnect"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="false"> <Value>identityProvider</Value> <Value>https://login.microsoftonline.com/[你的租户ID]/v2.0</Value> <Action>SkipThisValidationTechnicalProfile</Action> </Precondition> </Preconditions> </ValidationTechnicalProfile> <!-- 本地账号则继续密码验证 --> <ValidationTechnicalProfile ReferenceId="login-NonInteractive" /> </ValidationTechnicalProfiles> <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" /> </TechnicalProfile>
注意替换[你的租户ID]为实际的Entra租户ID,可通过B2C用户列表中社交账号的「标识提供者」字段获取。
3. 保留原有编排步骤
无需修改原有的CombinedSignInAndSignUp编排步骤,确保LocalAccountSigninEmailExchange指向修改后的SelfAsserted-LocalAccountSignin-Email即可:
<OrchestrationStep Order="2" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin"> <ClaimsProviderSelections> <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" /> <ClaimsProviderSelection TargetClaimsExchangeId="AzureADCommonExchange" /> <ClaimsProviderSelection TargetClaimsExchangeId="ForgotPasswordExchange" /> </ClaimsProviderSelections> <ClaimsExchanges> <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" /> </ClaimsExchanges> </OrchestrationStep>
方案效果
用户在统一登录页的本地账号框输入邮箱和密码后:
- 若邮箱关联的是Entra社交账号,系统自动跳转至Entra登录页面,引导用户用正确方式登录
- 若为本地账号,正常验证密码完成登录
- 完全保留原有统一登录页的用户体验,无需额外步骤
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

