通过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:
再在对应TechnicalProfile中添加输入声明和转换引用:<ClaimsTransformations> <ClaimsTransformation Id="ExtractFirstEmail" TransformationMethod="GetSingleItemFromJsonArray"> <InputClaims> <InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="inputJson" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations><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
相关产品推荐
相关产品推荐

