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
相关产品推荐
相关产品推荐

