为何在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上显示,需要两步:
- 在对应的TechnicalProfile里加
<InputClaim>来接收声明 - 如果要在注册页展示,再添加
<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
相关产品推荐
相关产品推荐

