Azure AD B2C问题:CopyClaim无法将值复制到SignInName
问题分析
你的配置中,登录技术配置文件SelfAsserted-LocalAccountSignin-Email的InputClaims部分对signInName设置了DefaultValue="{OIDC:LoginHint}"且AlwaysUseDefaultValue="true"。这个配置会覆盖之前通过InputClaimsTransformations复制过来的signInName值——因为InputClaims的处理顺序在InputClaimsTransformations之后,且AlwaysUseDefaultValue="true"会强制使用默认值,不管之前声明是否已有值。由于此时{OIDC:LoginHint}为空,最终signInName没有被赋值,导致登录页仍要求用户输入邮箱。
另外,需要确认signInName的声明类型(ClaimsSchema)已配置为只读,否则即使赋值成功,输入框也不会变成只读状态。
修复步骤
1. 修正登录技术配置文件的InputClaims
修改SelfAsserted-LocalAccountSignin-Email中的InputClaims,调整为使用已有的emailAddress声明作为默认值,且仅在无值时使用:
<InputClaims> <InputClaim ClaimTypeReferenceId="signInName" DefaultValue="{Claim:emailAddress}" AlwaysUseDefaultValue="false" /> </InputClaims>
或者直接去掉默认值配置(因为InputClaimsTransformations已经把emailAddress复制到signInName):
<InputClaims> <InputClaim ClaimTypeReferenceId="signInName" /> </InputClaims>
2. 确保signInName声明为只读
在ClaimsSchema中确认signInName的配置包含UserInputType="Readonly":
<ClaimType Id="signInName"> <DisplayName>Email Address</DisplayName> <DataType>string</DataType> <UserInputType>Readonly</UserInputType> </ClaimType>
3. 验证声明转换顺序
确保InputClaimsTransformations在InputClaims之前定义(你的现有配置已满足此要求,无需修改):
<InputClaimsTransformations> <InputClaimsTransformation ReferenceId="CopyOldUserEmailAddress" /> </InputClaimsTransformations> <InputClaims> <!-- 修正后的InputClaims配置 --> </InputClaims>
额外说明
注册页正常是因为注册技术配置文件没有类似的DefaultValue覆盖逻辑,所以CopyClaim的结果能正确传递到输入框。登录页的问题核心是默认值配置覆盖了已有声明值,而非安全限制。
内容的提问来源于stack exchange,提问作者TheGreatApe

