如何在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
相关产品推荐
相关产品推荐

