如何在Azure中将assertion传递的自定义声明存入访问令牌声明?
在Azure AD中实现从JWT Bearer断言提取自定义数据到访问令牌声明
针对你需要将urn:ietf:params:oauth:grant-type:jwt-bearer请求中assertion参数的自定义字段,提取并添加到Azure返回的访问令牌自定义声明中的需求,可按以下步骤操作:
1. 确认Azure AD应用基础配置
- 确保你的应用已在Azure AD中完成注册,且启用了
JWT Bearer授权类型(在应用的身份验证页面,检查支持的授权流是否包含该类型)。 - 验证客户端凭据(
client_id、client_secret)配置正确,可正常接收该授权类型的请求。
2. 根据Azure AD类型选择配置方式
场景A:使用Azure AD B2C(面向客户身份管理)
通过自定义策略实现断言解析与声明注入:
- 编辑
TrustFrameworkExtensions.xml自定义策略文件:- 添加声明转换规则,用于解析
assertion中的自定义字段:
重复上述配置可提取多个自定义字段。<ClaimsTransformation Id="ExtractCustomClaimsFromAssertion" TransformationMethod="GetClaimFromJwt"> <InputClaims> <InputClaim ClaimTypeReferenceId="assertion" TransformationClaimType="jwtToken" /> </InputClaims> <InputParameters> <InputParameter Id="claimName" DataType="string" Value="custom_field_1" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="customField1" TransformationClaimType="extractedClaim" /> </OutputClaims> </ClaimsTransformation> - 在用户旅程(UserJourney)的编排步骤中,添加该转换规则,确保在颁发令牌前执行:
<OrchestrationStep Order="5" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="ExtractCustomClaims" TechnicalProfileReferenceId="ExtractCustomClaimsProfile" /> </ClaimsExchanges> </OrchestrationStep> - 在
RelyingParty节点中,将自定义声明添加到输出列表,指定要包含在访问令牌中:<OutputClaim ClaimTypeReferenceId="customField1" PartnerClaimType="https://yourdomain.com/claims/custom_field1" />
- 添加声明转换规则,用于解析
- 上传并发布更新后的自定义策略。
场景B:使用Azure AD企业版(面向内部员工身份管理)
通过令牌颁发策略实现声明提取:
- 使用PowerShell创建令牌转换规则:
# 定义策略内容,提取assertion中的custom_field_1字段 $policyDefinition = @' [ { "RuleType": "ClaimsTransformation", "ClaimsTransformation": { "TransformationMethod": "ExtractClaimFromJwt", "InputClaims": [ { "ClaimType": "assertion", "TransformationClaimType": "jwtToken" } ], "OutputClaims": [ { "ClaimType": "customField1", "TransformationClaimType": "extractedClaim", "ClaimValue": "custom_field_1" } ] } } ] '@ # 创建令牌颁发策略 $policy = New-AzureADApplicationTokenIssuancePolicy -Definition $policyDefinition -DisplayName "ExtractCustomDataFromAssertion" -IsOrganizationDefault $false - 将策略关联到你的应用:
# 替换为你的应用ObjectId和策略ObjectId Add-AzureADApplicationPolicy -ObjectId "your-app-object-id" -RefObjectId $policy.ObjectId
3. 验证配置
发送授权请求到Azure令牌端点(https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token),携带assertion参数(包含自定义字段的有效JWT),解析返回的访问令牌,检查是否包含配置的自定义声明。
关键注意事项
assertion中的JWT必须签名有效,签名算法需符合Azure要求(推荐RS256),且受众(aud)需指向你的Azure应用或租户ID。- 自定义声明建议使用自定义命名空间(如
https://yourdomain.com/claims/前缀),避免与Azure AD默认声明冲突。 - 若使用B2C,需确保自定义策略已正确发布,且用户旅程的编排步骤顺序合理。
内容的提问来源于stack exchange,提问作者Sergey Tsypanov
相关产品推荐
相关产品推荐

