You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure B2C自定义策略id_token_hint提取email声明失败求助

问题解决方案

核心错误分析

  1. GetClaims步骤验证错误:你配置的技术Profile使用了Protocol Name="None",导致B2C无法正确解析并提取id_token_hint中的email声明,用户旅程实际未输出该声明,触发RP验证报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:44:58