You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
    
    如果需要在双字段都为空时设置自定义默认值,再加一个转换:
    <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>
    
    然后在注册TechnicalProfile的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:07:34