Azure B2C自定义策略:如何在登录/注册流程中重写重定向URL
在Azure B2C自定义策略中根据用户类型重定向至不同站点
可以直接在自定义策略XML中实现按用户类型动态重定向,完全无需JS或额外端点,具体实现步骤如下:
1. 定义用户类型声明
先在策略的<ClaimsSchema>中添加存储用户类型的声明,用于后续分支判断:
<ClaimsSchema> <ClaimType Id="userType"> <DisplayName>用户类型</DisplayName> <DataType>string</DataType> <UserHelpText>区分用户类型(如Admin、Customer)</UserHelpText> </ClaimType> </ClaimsSchema>
2. 确保获取用户类型声明
在登录/注册流程的TechnicalProfile中,加入读取用户类型的配置,比如从Azure AD B2C的用户属性中获取:
<OutputClaim ClaimTypeReferenceId="userType" />
如果是注册流程,可添加用户选择控件让用户指定类型,确保该声明被正确赋值。
3. 添加重定向URL转换规则
在<ClaimsTransformations>中定义不同用户类型对应的重定向URL:
<ClaimsTransformations> <!-- 管理员用户重定向规则 --> <ClaimsTransformation Id="SetAdminRedirectUri" TransformationMethod="CreateStringClaim"> <InputParameters> <InputParameter Id="value" DataType="string" Value="https://admin.yourdomain.com" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" TransformationClaimType="createdClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 普通用户重定向规则 --> <ClaimsTransformation Id="SetCustomerRedirectUri" TransformationMethod="CreateStringClaim"> <InputParameters> <InputParameter Id="value" DataType="string" Value="https://customer.yourdomain.com" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" TransformationClaimType="createdClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 默认重定向规则(兜底) --> <ClaimsTransformation Id="SetDefaultRedirectUri" TransformationMethod="CreateStringClaim"> <InputParameters> <InputParameter Id="value" DataType="string" Value="https://default.yourdomain.com" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" TransformationClaimType="createdClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
4. 创建转换规则对应的TechnicalProfile
为每个重定向规则创建专用的TechnicalProfile,用于触发转换逻辑:
<TechnicalProfiles> <TechnicalProfile Id="SetAdminRedirectUriProfile"> <DisplayName>设置管理员重定向地址</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" /> </OutputClaims> <ClaimsTransformations> <ClaimsTransformationReference Id="SetAdminRedirectUri" /> </ClaimsTransformations> </TechnicalProfile> <TechnicalProfile Id="SetCustomerRedirectUriProfile"> <DisplayName>设置普通用户重定向地址</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" /> </OutputClaims> <ClaimsTransformations> <ClaimsTransformationReference Id="SetCustomerRedirectUri" /> </ClaimsTransformations> </TechnicalProfile> <TechnicalProfile Id="SetDefaultRedirectUriProfile"> <DisplayName>设置默认重定向地址</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirectUri" /> </OutputClaims> <ClaimsTransformations> <ClaimsTransformationReference Id="SetDefaultRedirectUri" /> </ClaimsTransformations> </TechnicalProfile> </TechnicalProfiles>
5. 在用户旅程中添加条件分支
在登录/注册流程的编排步骤末尾,添加条件分支,根据userType的值触发对应的重定向规则:
<UserJourneys> <UserJourney Id="SignUpOrSignIn"> <OrchestrationSteps> <!-- 省略前面的登录/注册认证步骤 --> <!-- 第一步:触发默认重定向(匹配不到用户类型时执行) --> <OrchestrationStep Order="8" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>userType</Value> <Value>Admin</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>userType</Value> <Value>Customer</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="SetDefaultRedirect" TechnicalProfileReferenceId="SetDefaultRedirectUriProfile" /> </ClaimsExchanges> </OrchestrationStep> <!-- 第二步:管理员用户专属重定向 --> <OrchestrationStep Order="9" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="false"> <Value>userType</Value> <Value>Admin</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="SetAdminRedirect" TechnicalProfileReferenceId="SetAdminRedirectUriProfile" /> </ClaimsExchanges> </OrchestrationStep> <!-- 第三步:普通用户专属重定向 --> <OrchestrationStep Order="10" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="false"> <Value>userType</Value> <Value>Customer</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="SetCustomerRedirect" TechnicalProfileReferenceId="SetCustomerRedirectUriProfile" /> </ClaimsExchanges> </OrchestrationStep> <!-- 最后一步:使用修改后的redirectUri完成重定向 --> <OrchestrationStep Order="11" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" /> </OrchestrationSteps> </UserJourney> </UserJourneys>
6. 关键前置要求
所有动态设置的重定向URL,必须提前添加到Azure B2C租户的身份验证 > 应用注册 > 目标应用 > 身份验证 > 重定向URI列表中,否则会被策略拒绝。
内容的提问来源于stack exchange,提问作者Alexey Godyl
相关产品推荐
相关产品推荐

