AD B2C自定义用户旅程:过期令牌重定向URL添加邮箱及错误捕获
解决AD B2C中id_token_hint过期(AADB2C90208)时追加邮箱到重定向URL的方案
核心背景说明
AADB2C对id_token_hint的有效性校验是授权端点的内置前置逻辑,不会暴露在自定义用户旅程的步骤编排中,因此你排查用户旅程找不到验证步骤是正常现象。我们需要通过自定义策略的错误处理框架,结合声明转换来捕获错误并提取邮箱。
具体实现步骤
1. 声明所需的Claim类型
在自定义策略的<ClaimSchema>节点中添加以下声明,用于存储邮箱、id_token_hint及重定向URL:
<ClaimSchema> <ClaimType Id="email"> <DisplayName>Email Address</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="id_token_hint"> <DisplayName>ID Token Hint</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="redirect_uri"> <DisplayName>Redirect URI</DisplayName> <DataType>string</DataType> </ClaimType> </ClaimSchema>
2. 定义声明转换规则
添加两个声明转换:一个从过期的id_token_hint中提取邮箱(注:过期JWT的Payload为Base64编码明文,可直接解析,无需验证签名);另一个将邮箱追加到重定向URL:
<ClaimsTransformations> <!-- 从过期的id_token_hint中提取邮箱声明 --> <ClaimsTransformation Id="ExtractEmailFromExpiredIdTokenHint" TransformationMethod="GetClaimFromIdTokenHint"> <InputParameters> <InputParameter Id="claimType" DataType="string" Value="email" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="extractedClaim" /> </OutputClaims> </ClaimsTransformation> <!-- 将邮箱追加到重定向URL末尾 --> <ClaimsTransformation Id="AppendEmailToRedirectUri" TransformationMethod="StringFormat"> <InputParameters> <InputParameter Id="inputClaimType" DataType="string" Value="redirect_uri" /> <InputParameter Id="stringFormat" DataType="string" Value="{0}?email={{{email}}}" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="redirect_uri" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
3. 创建错误处理技术配置文件
定义专门处理AADB2C90208错误的技术配置文件,负责捕获错误、提取邮箱并构造新的重定向URL:
<TechnicalProfiles> <TechnicalProfile Id="HandleExpiredIdTokenHintError"> <DisplayName>Handle AADB2C90208 Error</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ErrorHandlerProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ErrorCode">AADB2C90208</Item> <Item Key="AllowRedirectWithClaims">true</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="id_token_hint" /> <InputClaim ClaimTypeReferenceId="redirect_uri" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" /> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="ExtractEmailFromExpiredIdTokenHint" /> <OutputClaimsTransformation ReferenceId="AppendEmailToRedirectUri" /> </OutputClaimsTransformations> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile> </TechnicalProfiles>
4. 映射错误到处理逻辑
在自定义策略的<Errors>节点中,将AADB2C90208错误绑定到上述技术配置文件:
<Errors> <Error ErrorType="AADB2C90208" Handler="TechnicalProfile" HandlerParameter="HandleExpiredIdTokenHintError" /> </Errors>
5. 确保传递必要的输入声明
在<RelyingParty>节点中添加id_token_hint作为输入声明,确保策略能获取到该参数:
<RelyingParty> <DefaultUserJourney ReferenceId="YourCustomUserJourneyId" /> <InputClaims> <InputClaim ClaimTypeReferenceId="id_token_hint" /> </InputClaims> <!-- 其他依赖方配置 --> </RelyingParty>
关键注意事项
- 若原重定向URL已包含查询参数,需调整
AppendEmailToRedirectUri的格式为{0}&email={{{email}}}避免URL格式错误。 - 确保你的应用注册允许重定向URL包含自定义参数,AD B2C默认支持此配置。
- 过期
id_token_hint的Payload必须包含email声明,否则无法提取,需确保生成该令牌时已包含此声明。
内容的提问来源于stack exchange,提问作者Luka Gospodnetic
相关产品推荐
相关产品推荐

