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

通过Entra ID登录时未返回邮箱地址声明的问题求助

解决Azure AD B2C自定义策略中Entra ID登录不返回邮箱声明的问题

以下是针对性的解决步骤:

1. 确保身份提供者请求了email权限范围

在Entra ID对应的TechnicalProfile的Protocol节点Metadata中,添加包含email的scope参数,确保登录时向Entra ID请求邮箱权限:

<TechnicalProfile Id="AADMultiTenantProfile">
  <Protocol Name="OpenIdConnect" />
  <Metadata>
    <!-- 保留其他元数据 -->
    <Item Key="scope">openid profile email</Item>
  </Metadata>
  <!-- 保留其他配置 -->
</TechnicalProfile>

这是核心前提:如果未请求email范围,Entra ID不会返回邮箱相关声明,登录对话框也不会显示邮箱请求提示。

2. 正确映射邮箱声明(适配单/多邮箱场景)

Entra ID返回的邮箱可能是单个email字段,也可能是多邮箱数组emails,需根据实际情况调整:

  • 若为单个邮箱字段,直接映射:
    <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
    
  • 若为多邮箱数组,需先提取第一个邮箱:
    先在扩展策略中添加ClaimsTransformation:
    <ClaimsTransformations>
      <ClaimsTransformation Id="ExtractFirstEmail" TransformationMethod="GetSingleItemFromJsonArray">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="inputJson" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" TransformationClaimType="outputClaim" />
        </OutputClaims>
      </ClaimsTransformation>
    </ClaimsTransformations>
    
    再在对应TechnicalProfile中添加输入声明和转换引用:
    <TechnicalProfile Id="AADMultiTenantProfile">
      <InputClaims>
        <!-- 保留其他输入声明 -->
        <InputClaim ClaimTypeReferenceId="emails" />
      </InputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="ExtractFirstEmail" />
      </OutputClaimsTransformations>
    </TechnicalProfile>
    

3. 在RelyingParty中配置输出邮箱声明

确保在SignUporSignIn.xml的RelyingParty节点里,将邮箱声明加入OutputClaims,这样它才会出现在最终的JWT响应中:

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
  <TechnicalProfile Id="PolicyProfile">
    <DisplayName>PolicyProfile</DisplayName>
    <Protocol Name="OpenIdConnect" />
    <OutputClaims>
      <!-- 保留其他输出声明 -->
      <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" />
    </OutputClaims>
    <!-- 保留其他配置 -->
  </TechnicalProfile>
</RelyingParty>

4. 确认ClaimType定义存在

检查基础策略(如TrustFrameworkBase.xml)或扩展策略中是否已定义signInNames.emailAddress类型:

<ClaimType Id="signInNames.emailAddress">
  <DisplayName>Email Address</DisplayName>
  <DataType>string</DataType>
  <UserHelpText>Email address that can be used to contact you.</UserHelpText>
  <UserInputType>TextBox</UserInputType>
</ClaimType>

内容的提问来源于stack exchange,提问作者John Bishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:24:51