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

为何在TechnicalProfile中需将Email声明设为InputClaim?

我来帮你把这个问题掰明白哈!

为啥Email声明必须加到TechnicalProfile的<InputClaim>里才生效?

Azure AD B2C的声明流转是有严格规则的,不是随便传就能被注册策略识别到:

  • 声明的“准入机制”:当你从上游(比如你的应用、父策略)传入声明时,当前的TechnicalProfile只会处理那些被**显式声明为<InputClaim>**的内容。如果没加这行配置,哪怕声明已经存在于整个用户旅程的上下文里,这个TechnicalProfile也不会主动去读取它,自然没法在注册流程里用(比如预填邮箱、做验证或者存到用户目录)。
  • 注册组件的特殊性:负责注册的TechnicalProfile(比如LocalAccountSignUpWithLogonEmail)是处理用户数据的核心,它需要明确知道“哪些声明是我要处理的”——<InputClaim>就相当于给它开了个“接收权限”,告诉它这个声明要交给它处理。
为啥extension_MyCustomClaim没展示但被持久化了?

这是因为B2C的持久化逻辑和UI展示是完全独立的:

  • 只要你在策略里配置了<PersistedClaim ReferenceId="extension_MyCustomClaim" />,不管这个声明有没有在UI上展示(也就是有没有<DisplayClaim>或者<OutputClaim>),只要声明上下文里存在这个值,B2C就会把它存到用户目录里。
  • 你可能是从上游传递了这个自定义声明的值,虽然没在当前TechnicalProfile里加<InputClaim>,但它已经存在于用户旅程的声明包中了,所以持久化组件能读到它并保存,但因为没配置展示相关的节点,UI上自然看不到。
小补充:怎么让传入的声明既生效又能展示?

如果想让传入的声明既能被处理,又能在UI上显示,需要两步:

  1. 在对应的TechnicalProfile里加<InputClaim>来接收声明
  2. 如果要在注册页展示,再添加<DisplayClaim>关联UI控件

给你个简单的配置示例参考:

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
  <InputClaims>
    <!-- 显式声明要接收的email和自定义声明 -->
    <InputClaim ClaimTypeReferenceId="email" DefaultValue="{OIDC:LoginHint}" />
    <InputClaim ClaimTypeReferenceId="extension_MyCustomClaim" />
  </InputClaims>
  <PersistedClaims>
    <PersistedClaim ClaimTypeReferenceId="email" />
    <PersistedClaim ClaimTypeReferenceId="extension_MyCustomClaim" />
  </PersistedClaims>
  <DisplayClaims>
    <!-- 要在注册页展示自定义声明的话,加这行 -->
    <DisplayClaim ClaimTypeReferenceId="extension_MyCustomClaim" />
  </DisplayClaims>
</TechnicalProfile>

内容的提问来源于stack exchange,提问作者spottedmahn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:03:24