Azure B2C自定义策略id_token_hint提取email声明失败求助
问题解决方案
核心错误分析
- GetClaims步骤验证错误:你配置的技术Profile使用了
Protocol Name="None",导致B2C无法正确解析并提取id_token_hint中的email声明,用户旅程实际未输出该声明,触发RP验证报错。 - ClaimsExchange步骤运行时错误:
ClaimsExchange类型的步骤要求技术Profile必须指定支持的协议(如OpenIdConnect、REST),None协议没有对应的处理程序,因此出现找不到协议处理器的错误。
正确配置步骤
1. 修正提取id_token_hint的技术Profile
将协议改为OpenIdConnect,补充必要元数据确保B2C能验证并解析自签名JWT:
<TechnicalProfile Id="IdTokenHint_ExtractClaims"> <DisplayName>ID Token Hint Technical Profile</DisplayName> <Protocol Name="OpenIdConnect" /> <Metadata> <Item Key="METADATA">https://<my-domain>/.well-known/openid-configuration</Item> <Item Key="issuer">https://localhost/</Item> <!-- 替换为你的B2C策略受众,通常是策略应用ID或租户策略URL --> <Item Key="IdTokenAudience">https://mytenant.b2clogin.com/mytenant.onmicrosoft.com/B2C_1A_dantest</Item> <!-- 测试环境可设为true,生产环境需改为false --> <Item Key="AllowInsecureAuthInProduction">false</Item> </Metadata> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" /> </OutputClaims> </TechnicalProfile>
2. 确保ClaimsSchema中定义email声明
若未定义,需在<BuildingBlocks>下的<ClaimsSchema>中添加:
<ClaimType Id="email"> <DisplayName>Email Address</DisplayName> <DataType>string</DataType> <UserHelpText>用户邮箱地址</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType>
3. 正确配置用户旅程中的GetClaims步骤
使用GetClaims类型步骤提取声明,并确保后续步骤传递该声明到RP:
<OrchestrationStep Order="1" Type="GetClaims" CpimIssuerTechnicalProfileReferenceId="IdTokenHint_ExtractClaims" /> <!-- 可选:添加读取用户信息的步骤,验证邮箱对应用户存在 --> <OrchestrationStep Order="2" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AADUserReadUsingEmail" TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress" /> </ClaimsExchanges> </OrchestrationStep> <!-- 后续添加密码设置等业务步骤 -->
4. 验证Relying Party配置
确保RP的<OutputClaims>包含email,且用户旅程步骤能输出该声明:
<RelyingParty> <DefaultUserJourney ReferenceId="DanTest" /> <TechnicalProfile Id="PolicyProfile"> <DisplayName>PolicyProfile</DisplayName> <Protocol Name="OpenIdConnect" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="email" /> <!-- 其他需要的输出声明 --> </OutputClaims> </TechnicalProfile> </RelyingParty>
关键说明
GetClaims步骤专门用于从id_token_hint或授权代码中提取声明,必须搭配OpenIdConnect协议的技术Profile。- 自签名JWT的
issuer必须与技术Profile配置的issuer完全一致,aud必须匹配IdTokenAudience的值,否则B2C会拒绝解析。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

