Azure AD B2C忘记密码流程:如何将邮箱作为输入声明发送至REST API
解决Azure AD B2C忘记密码流程中邮箱无法传递到REST API的问题
问题根源
你当前的配置中,<AAD-UserReadUsingObjectId>输出的是signInNames.emailAddress声明,但<AAD-SyncPassword>尝试引用的是email声明,二者未建立映射关系,导致email声明为空,无法传递到REST API。此外需确保读取用户信息的步骤确实能输出邮箱声明并传递到后续验证环节。
具体解决方案
方案1:直接在REST技术配置中使用signInNames.emailAddress声明
修改<AAD-SyncPassword>的<InputClaims>部分,将邮箱声明直接改为从AAD读取的signInNames.emailAddress,无需额外映射:
<TechnicalProfile Id="AAD-SyncPassword"> <DisplayName>Update Password</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://ourapi/api/v1/Identity/UpdatePW</Item> <Item Key="AuthenticationType">ApiKeyHeader</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="AllowInsecureAuthInProduction">false</Item> </Metadata> <CryptographicKeys> <Key Id="SPECIAL-KEY-HEADER" StorageReferenceId="B2C_1A_RestApiKey"/> </CryptographicKeys> <InputClaims> <!-- 直接使用从AAD读取的邮箱声明 --> <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="signInNames.emailAddress" Required="true" /> <InputClaim ClaimTypeReferenceId="userPrincipalName"/> <InputClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password"/> </InputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
方案2:将signInNames.emailAddress映射到email声明
如果业务需要统一使用email声明,修改<AAD-UserReadUsingObjectId>的<OutputClaims>,添加声明映射:
<TechnicalProfile Id="AAD-UserReadUsingObjectId"> <Metadata> <Item Key="Operation">Read</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item> </Metadata> <IncludeInSso>false</IncludeInSso> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" Required="true" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" /> <!-- 将AAD返回的邮箱值映射到email声明 --> <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" /> <OutputClaim ClaimTypeReferenceId="otherMails" /> <OutputClaim ClaimTypeReferenceId="givenName" /> <OutputClaim ClaimTypeReferenceId="surname" /> </OutputClaims> <IncludeTechnicalProfile ReferenceId="AAD-Common" /> </TechnicalProfile>
修改后,<AAD-SyncPassword>中原来的email声明引用就能正确获取到邮箱值。
额外验证点
- 确认
<LocalAccountWritePasswordUsingObjectId>中的验证技术配置顺序:<AAD-UserReadUsingObjectId>必须在<AAD-SyncPassword>之前执行,确保邮箱声明已被读取并存在于当前用户会话中。 - 检查
<ClaimsSchema>中是否正确定义了相关声明(默认已包含,若缺失需手动添加):
<ClaimType Id="email"> <DisplayName>Email Address</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="signInNames.emailAddress"> <DisplayName>Email Address</DisplayName> <DataType>string</DataType> </ClaimType>
内容的提问来源于stack exchange,提问作者code_disciple
相关产品推荐
相关产品推荐

