能否创建已知邮箱的Azure AD B2C自定义密码重置策略?
解决自定义策略中绕过密码重置邮箱验证的问题
我之前遇到过几乎一模一样的场景,咱们一步步来搞定这个问题——核心思路就是让自定义策略信任你传入的邮箱声明,跳过默认的邮箱验证流程,直接用这个已确认的邮箱来让用户设置密码。
1. 改造密码重置的用户旅程(UserJourney)
找到你自定义策略里负责密码重置的UserJourney(通常命名为PasswordReset),把里面原本要求用户输入邮箱并验证的步骤替换掉。比如原来的流程可能是:
SelfAsserted-LocalAccountPasswordReset → 发送验证邮件 → 验证邮件链接
你需要把这几步改成直接读取传入的email声明,不需要用户再输入或验证。具体来说,移除涉及邮箱输入和验证的步骤,直接跳转到设置密码的环节。
2. 把传入的邮箱标记为「已验证」
自定义策略默认只信任自己验证过的邮箱,所以你需要显式把令牌里的邮箱声明标记为已验证:
- 先在策略的
<ClaimsSchema>里添加一个verifiedEmail声明(如果还没有的话):<ClaimType Id="verifiedEmail"> <DisplayName>Verified Email</DisplayName> <DataType>string</DataType> </ClaimType> - 然后添加一个声明转换,把传入的
email转成已验证的邮箱:<ClaimsTransformation Id="MarkEmailAsVerified" TransformationMethod="AddItemToStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="verifiedEmail" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation> - 在处理令牌的TechnicalProfile(比如你用来接收签名令牌的那个Profile)里调用这个转换,确保邮箱被标记为已验证:
<TechnicalProfile Id="JwtIssuer"> <!-- 其他配置 --> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="MarkEmailAsVerified" /> </OutputClaimsTransformations> </TechnicalProfile>
3. 调整密码重置的TechnicalProfile,直接用已验证邮箱
找到负责写入密码的LocalAccountWritePasswordUsingObjectId TechnicalProfile,修改它的输入声明,确保使用已验证的邮箱:
<TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId"> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" /> <InputClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password" /> <!-- 添加这一行,用已验证的邮箱 --> <InputClaim ClaimTypeReferenceId="verifiedEmail" PartnerClaimType="email" /> </InputClaims> <!-- 其他配置不变 --> </TechnicalProfile>
4. 最后检查声明映射是否正确
虽然你说已经跟踪到策略拿到了邮箱声明,但还是要确认令牌里的声明名称和策略里的ClaimType Id完全一致——比如令牌里是email,策略里也得是email,不能写成userEmail或者upn(除非你特意做了映射)。
做完这些调整后,用户点击邀请链接时,策略会直接跳过邮箱验证,进入设置密码的页面,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Klio
相关产品推荐
相关产品推荐

