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

Azure B2C自定义策略:如何动态选择Claim作为SubjectNamingInfo?

解决方案

要实现extensionAttribute11存在时优先用它作为SubjectNamingInfo,否则 fallback 到email,需通过自定义声明转换(ClaimsTransformation)实现,具体步骤如下:

1. 定义声明转换规则

在<ClaimsTransformations>节点下添加优先取非空声明的转换规则,逻辑为检查extensionAttribute11是否存在,存在则赋值给新声明,否则使用email:

<ClaimsTransformations>
  <ClaimsTransformation Id="UseExtensionAttribute11OrEmail" TransformationMethod="GetNonEmptyClaim">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_7e93b79c37504f30a2345fa9ac315bb0_extensionAttribute11" TransformationClaimType="inputClaim1" />
      <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim2" />
    </InputClaims>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="preferredEmail" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

同时在<ClaimTypes>中声明新的preferredEmail类型:

<ClaimType Id="preferredEmail">
  <DisplayName>Preferred Email</DisplayName>
  <DataType>string</DataType>
</ClaimType>

2. 修改技术配置调用转换

更新你的PolicyProfile技术配置,添加转换调用逻辑,将转换后的声明设为SubjectNamingInfo:

<TechnicalProfile Id="PolicyProfile">
  <DisplayName>PolicyProfile</DisplayName>
  <Protocol Name="SAML2" />
  <!-- 调用声明转换 -->
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="UseExtensionAttribute11OrEmail" />
  </InputClaimsTransformations>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="givenName" />
    <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="surname" />
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
    <OutputClaim ClaimTypeReferenceId="extension_7e93b79c37504f30a2345fa9ac315bb0_extensionAttribute11" PartnerClaimType="extensionAttribute11" />
    <!-- 可选:输出转换后的优先邮箱声明给信赖方 -->
    <OutputClaim ClaimTypeReferenceId="preferredEmail" PartnerClaimType="preferredEmail" />
  </OutputClaims>
  <!-- 将SubjectNamingInfo指向转换后的声明 -->
  <SubjectNamingInfo ClaimType="preferredEmail" ExcludeAsClaim="false"/>
</TechnicalProfile>

3. 关键说明

  • GetNonEmptyClaim转换方法会依次检查输入声明,返回第一个非空值,完美匹配你的 fallback 需求;
  • 无需重复设置相同PartnerClaimType,避免触发冲突错误;
  • 若不需要将preferredEmail输出给信赖方,可删除对应的<OutputClaim>节点,仅保留SubjectNamingInfo配置即可。

内容的提问来源于stack exchange,提问作者Ben O'Malley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:40:38