添加ValidationTechnicalProfile后密码重置流程邮箱验证UI消失问题排查
REST技术配置文件输入Claim与重置流程逻辑冲突
你的REST-UserMigration-LocalAccount-LoalAccountUserExsist技术配置文件要求输入signInName和password,但密码重置第一步是邮箱验证环节,用户处于“忘记密码”状态,既不会提供原有密码,当前SelfAsserted技术配置文件也仅收集并验证email,无法提供这两个Claim。SelfAsserted Provider自动收集逻辑打乱原有流程
SelfAsserted Attribute Provider会自动检测ValidationTechnicalProfiles中所有技术配置文件的输入需求,当发现缺失password时,会直接显示密码输入框以收集该Claim,跳过了原本的邮箱验证步骤,导致UI异常。迁移时机不符合重置流程场景
密码重置的核心逻辑是先验证用户邮箱合法性,再允许设置新密码,你的REST迁移接口要求输入密码,完全违背了“忘记密码”场景下用户无法提供原密码的基本逻辑。
1. 修改REST技术配置文件的输入输出
调整输入Claim为当前流程已有的email,移除不需要的password输入,清理与重置流程无关的输出Claim:
<TechnicalProfile Id="REST-UserMigration-LocalAccount-LoalAccountUserExsist"> <DisplayName>Migrate user password flow</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://somefunctapp-rest-api.azurewebsites.net/api/MigrateIfExists?code=ugqr4ESgMENWlRdILvuOWkksuLy-zoPm76stOuiHFtzFAzzuiHFKcw==</Item> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="AllowInsecureAuthInProduction">True</Item> </Metadata> <InputClaims> <!-- 替换为当前流程已收集的email Claim,映射为接口需要的signInName --> <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInName" /> <!-- 移除password输入,重置流程第一步无密码 --> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="migrationRequired" /> <OutputClaim ClaimTypeReferenceId="email" /> <OutputClaim ClaimTypeReferenceId="displayName" /> <OutputClaim ClaimTypeReferenceId="givenName" /> <OutputClaim ClaimTypeReferenceId="surName" /> <OutputClaim ClaimTypeReferenceId="sub" PartnerClaimType="userId" /> <!-- 移除newPassword输出,用户将自行设置新密码 --> <OutputClaim ClaimTypeReferenceId="trueValue" DefaultValue="true"/> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
2. 调整ValidationTechnicalProfiles的执行顺序
先执行AAD-UserReadUsingEmailAddress检查用户是否已存在于B2C,若不存在再执行REST迁移,确保迁移仅针对未在B2C中的用户:
<ValidationTechnicalProfiles> <!-- 先检查B2C中是否存在用户 --> <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress"/> <!-- 再执行迁移(需配合REST接口逻辑,仅当用户不存在时处理) --> <ValidationTechnicalProfile ReferenceId="REST-UserMigration-LocalAccount-LoalAccountUserExsist"/> </ValidationTechnicalProfiles>
3. 适配REST接口逻辑
将MigrateIfExists接口调整为:仅通过邮箱查询旧系统是否存在用户,若存在则将用户基础信息迁移到B2C,无需接收密码参数。迁移完成后返回用户信息,供后续密码重置步骤使用。
4. 确保邮箱验证步骤正常触发
确认LocalAccountDiscoveryUsingEmailAddress-Migration的OutputClaims中,email标记为Required=true且PartnerClaimType="Verified.Email",保证邮箱验证流程正常执行:
<OutputClaims> <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" /> <OutputClaim ClaimTypeReferenceId="objectId" /> <OutputClaim ClaimTypeReferenceId="userPrincipalName" /> <OutputClaim ClaimTypeReferenceId="authenticationSource" /> </OutputClaims>
内容的提问来源于stack exchange,提问作者Sen

