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

