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

如何在Azure AD B2C自定义策略中提取嵌套idp_access_token的信息

解决方案

你的问题核心在于:直接在OAuth技术配置文件中通过PartnerClaimType="unique_name"映射email声明时,B2C默认会从外部IDP的id_token中提取数据,但你的unique_name实际存在于access_token(即idp_access_token)里,所以映射不生效;添加默认值后显示是因为默认值会强制填充声明,和IDP返回的数据无关。

以下是两种可行的解决方法:

方法1:通过声明转换解析idp_access_token提取数据

步骤1:定义声明类型

确保email和identityProviderAccessToken的声明类型已正确定义(若未定义):

<BuildingBlocks>
  <ClaimsSchema>
    <ClaimType Id="email">
      <DisplayName>邮箱地址</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
    <ClaimType Id="identityProviderAccessToken">
      <DisplayName>身份提供商访问令牌</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
  </ClaimsSchema>
</BuildingBlocks>

步骤2:添加JWT解析声明转换

创建一个从idp_access_token中提取unique_name并赋值给email的转换:

<ClaimsTransformations>
  <ClaimsTransformation Id="ExtractEmailFromIdpAccessToken" TransformationMethod="GetClaimFromJwt">
    <InputClaims>
      <!-- 输入要解析的JWT令牌 -->
      <InputClaim ClaimTypeReferenceId="identityProviderAccessToken" TransformationClaimType="inputJwt" />
    </InputClaims>
    <OutputClaims>
      <!-- 输出提取到的声明到email字段 -->
      <OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="claim" />
    </OutputClaims>
    <InputParameters>
      <!-- 指定要提取的声明名称 -->
      <InputParameter Id="claimName" DataType="string" Value="unique_name" />
      <!-- 可选:指定令牌的issuer,增强安全性,替换为你的外部IDP的issuer值 -->
      <InputParameter Id="issuer" DataType="string" Value="https://your-external-idp.com/issuer" />
    </InputParameters>
  </ClaimsTransformation>
</ClaimsTransformations>

步骤3:在技术配置文件中调用转换

修改你的OAuth技术配置文件,添加声明转换的调用:

<TechnicalProfile Id="Your-OAuth-Technical-Profile">
  <Protocol Name="OAuth2"/>
  <OutputTokenFormat>JWT</OutputTokenFormat>
  <Metadata>...</Metadata>
  <CryptographicKeys>...</CryptographicKeys>
  <InputClaims>...</InputClaims>
  <OutputClaims>    
    <OutputClaim ClaimTypeReferenceId="identityProviderAccessToken" PartnerClaimType="{oauth2:access_token}"/>
  </OutputClaims>
  <!-- 添加声明转换 -->
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="ExtractEmailFromIdpAccessToken" />
  </OutputClaimsTransformations>
</TechnicalProfile>

方法2:配置OAuth技术配置文件直接从access_token获取声明

如果外部IDP的access_token是JWT格式,可以直接配置技术配置文件从access_token中提取声明,无需额外转换:

步骤1:修改OAuth技术配置文件的Metadata

添加AccessTokenResponseClaims元数据,指定要从access_token中提取的声明:

<TechnicalProfile Id="Your-OAuth-Technical-Profile">
  <Protocol Name="OAuth2"/>
  <OutputTokenFormat>JWT</OutputTokenFormat>
  <Metadata>
    <!-- 其他元数据 -->
    <!-- 指定从access_token中提取unique_name声明 -->
    <Item Key="AccessTokenResponseClaims">unique_name</Item>
  </Metadata>
  <CryptographicKeys>...</CryptographicKeys>
  <InputClaims>...</InputClaims>
  <OutputClaims>    
    <!-- 现在可以直接映射unique_name到email -->
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="unique_name"/>                         
    <OutputClaim ClaimTypeReferenceId="identityProviderAccessToken" PartnerClaimType="{oauth2:access_token}"/>
  </OutputClaims>
</TechnicalProfile>

验证

完成配置后,你的RelyingParty配置无需修改,B2C令牌中即可正常包含email声明,值来自idp_access_token中的unique_name。

内容的提问来源于stack exchange,提问作者Anton Putau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:12:07