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

Azure AD B2C自定义策略:如何在id_token中可选包含声明?

Azure AD B2C 实现可选声明的推荐方式

针对你需要根据依赖方的特定查询参数或范围来决定是否在id_token中包含某个已存在声明的需求,以下是几种实用的实现方案:

1. 通过自定义范围触发可选声明

利用Azure AD B2C的范围机制,让依赖方通过请求特定自定义范围来获取目标声明:

  • 在你的Azure AD B2C租户的应用注册中,添加自定义范围(例如urn:yourtenant:yourapp:claim:optional)。
  • 在User Journey的RelyingParty节点下,为目标声明添加前置条件,仅当请求的范围包含该自定义范围时才输出声明:
    <OutputClaim ClaimTypeReferenceId="YourExistingClaim" PartnerClaimType="optional_claim">
      <Preconditions>
        <Precondition Type="ClaimContains" ExecuteActionsIf="true">
          <Value>oauth2Permissions</Value>
          <Value>urn:yourtenant:yourapp:claim:optional</Value>
          <Action>IncludeClaim</Action>
        </Precondition>
        <Precondition Type="Always" ExecuteActionsIf="false">
          <Action>SkipThisClaim</Action>
        </Precondition>
      </Preconditions>
    </OutputClaim>
    
  • 依赖方在授权请求中添加scope=... urn:yourtenant:yourapp:claim:optional,即可触发该声明的返回。

2. 通过自定义查询参数触发可选声明

让依赖方在授权请求中携带自定义查询参数,以此控制声明是否返回:

  • 在TrustFrameworkExtensions.xml中定义一个用于捕获查询参数的声明类型:
    <ClaimType Id="IsOptionalClaimRequested">
      <DisplayName>Request Optional Claim</DisplayName>
      <DataType>boolean</DataType>
      <UserInputType>Checkbox</UserInputType>
    </ClaimType>
    
  • 在处理授权请求的Technical Profile(例如JwtIssuer或用于收集参数的SelfAsserted技术配置文件)中,添加输入声明捕获该查询参数:
    <InputClaim ClaimTypeReferenceId="IsOptionalClaimRequested" PartnerClaimType="request_optional_claim" DefaultValue="false" />
    
  • 在输出目标声明时,添加前置条件判断该参数是否为true:
    <OutputClaim ClaimTypeReferenceId="YourExistingClaim" PartnerClaimType="optional_claim">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
          <Value>IsOptionalClaimRequested</Value>
          <Value>true</Value>
          <Action>IncludeClaim</Action>
        </Precondition>
        <Precondition Type="Always" ExecuteActionsIf="false">
          <Action>SkipThisClaim</Action>
        </Precondition>
      </Preconditions>
    </OutputClaim>
    
  • 依赖方请求时添加request_optional_claim=true参数,即可触发声明返回。

3. 动态复制声明并条件输出

通过创建新声明,仅在满足条件时复制原声明的值,再输出新声明(避免原声明被空值污染):

  • 定义一个新的声明类型(例如OptionalClaimOutput),用于承载条件化的声明值。
  • 创建一个CopyClaim类型的Claims Transformation,将原声明的值复制到新声明:
    <ClaimsTransformation Id="CopyOptionalClaim" TransformationMethod="CopyClaim">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="YourExistingClaim" TransformationClaimType="inputClaim" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="OptionalClaimOutput" TransformationClaimType="outputClaim" />
      </OutputClaims>
    </ClaimsTransformation>
    
  • 在User Journey中,添加一个调用该Transformation的步骤,并设置前置条件(比如检查范围或查询参数):
    <OrchestrationStep Order="X" Type="ClaimsExchange">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
          <Value>IsOptionalClaimRequested</Value>
          <Value>true</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <ClaimsExchanges>
        <ClaimsExchange Id="CopyOptionalClaimExchange" TechnicalProfileReferenceId="CopyOptionalClaimProfile" />
      </ClaimsExchanges>
    </OrchestrationStep>
    
  • 最后在RelyingParty的输出声明中仅配置新声明OptionalClaimOutput,这样只有当条件满足时,新声明存在才会被加入id_token。

关键注意事项

  • 不要使用将声明设为null的方式,Azure AD B2C会将其转为空字符串输出;正确的做法是通过SkipThisClaim动作或仅在条件满足时生成声明,确保未触发条件时该声明不在输出列表中。
  • 所有配置修改后,记得同步更新TrustFrameworkBase.xml或TrustFrameworkExtensions.xml,并重新发布策略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:47:13