Azure AD B2C自定义策略:OutputClaimsTransformation生成displayName异常
问题诊断与修复方案
1. 可选字段为空导致displayName被设为"unknown"
你配置的givenName和surName是可选收集字段(未标记Required="true"),如果用户注册时未填写这两个字段,FormatStringMultipleClaims会生成空的displayName,而Azure AD B2C会自动将空的displayName填充为"unknown"。
修复方式:
- 强制必填:在注册TechnicalProfile的
OutputClaims中给givenName和surName添加Required="true",确保用户必须填写:<OutputClaim ClaimTypeReferenceId="givenName" Required="true" /> <OutputClaim ClaimTypeReferenceId="surName" Required="true" /> - 处理空值场景:修改ClaimsTransformation,支持单字段为空或双字段为空的情况:
比如使用带条件的格式字符串,自动跳过空字段的空格:
如果需要在双字段都为空时设置自定义默认值,再加一个转换:<ClaimsTransformation Id="CreateDisplayNameFromFirstNameAndLastName" TransformationMethod="FormatStringMultipleClaims"> <InputClaims> <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="surName" TransformationClaimType="inputClaim2" /> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" DataType="string" Value="{0}{1:+ {1}}" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
然后在注册TechnicalProfile的<ClaimsTransformation Id="SetDefaultDisplayName" TransformationMethod="FormatStringClaim"> <InputClaims> <InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" DataType="string" Value="{0:Guest User}" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>OutputClaimsTransformations中按顺序调用:<OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="CreateDisplayNameFromFirstNameAndLastName" /> <OutputClaimsTransformation ReferenceId="SetDefaultDisplayName" /> </OutputClaimsTransformations>
2. ClaimType拼写不一致(潜在数据持久化问题)
在AAD-CustomUserWriteUsingLogonEmail的PersistedClaims中,你写的是surname(首字母小写),但注册流程中收集和转换用的是surName(首字母大写)。Azure AD B2C的ClaimType名称区分大小写,这会导致用户输入的姓氏无法正确持久化到Azure AD中。
修复方式:
统一拼写,将PersistedClaims中的surname改为surName:
<PersistedClaim ClaimTypeReferenceId="surName" />
3. 检查displayName的ClaimType默认值
如果你的displayName ClaimType定义中设置了DefaultValue="unknown",当转换后的displayName为空时,会自动使用该默认值。检查ClaimType配置:
<ClaimType Id="displayName"> <DisplayName>Display Name</DisplayName> <DataType>string</DataType> <DefaultValue>unknown</DefaultValue> <!-- 若存在此配置,空值时会显示unknown --> </ClaimType>
如果不需要这个默认值,直接移除即可;如果需要,则确保转换后的displayName不会为空。
内容的提问来源于stack exchange,提问作者KevinG
相关产品推荐
相关产品推荐

