azure - 如何从 ADFS 作为身份提供者输出 B2C 中的组声明
问题描述
我通过 OpenID Connect 将 ADFS 用作 Azure B2C 的 IdP。登录有效,B2C 从 ADFS 发送 UPN 作为 JWT 令牌中的 socialIdpUserId 声明。
但是来自 ADFS 的组声明不起作用。如何在 JWT 中接收团体索赔?
这是设置:ADFS 声明规则:域安全组和 upn
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname",
Issuer == "AD AUTHORITY"] =>
issue(store = "Active Directory",
types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", "http://schemas.xmlsoap.org/claims/Group"),
query = ";userPrincipalName,tokenGroups(longDomainQualifiedName);{0}",
param = c.Value);
ClaimsSchema 中 TrustFrameworkBase 策略中的新组声明类型定义:
<ClaimsSchema><ClaimType Id="group">
<DisplayName>group</DisplayName>
<DataType>string</DataType>
<DefaultPartnerClaimTypes>
<Protocol Name="OAuth2" PartnerClaimType="group" />
<Protocol Name="OpenIdConnect" PartnerClaimType="group" />
<Protocol Name="SAML2" PartnerClaimType="http://schemas.xmlsoap.org/claims/Group" />
</DefaultPartnerClaimTypes>
</ClaimType></ClaimsSchema>
TrustFrameworkExtensions 策略中 TechnicalProfile 中的输出组声明定义:
<OutputTokenFormat>JWT</OutputTokenFormat><OutputClaims>
<OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="UPN" />
<OutputClaim ClaimTypeReferenceId="group" PartnerClaimType="group" />
</OutputClaims>
在 SignUpOrSignIn 策略文件的 TechnicalProfile 中输出组声明定义
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="socialIdpUserId" />
<OutputClaim ClaimTypeReferenceId="group" />
<OutputClaim ClaimTypeReferenceId="authmethod" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="identityProvider" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
但是JWT 令牌没有组声明!为什么?
解决方案
看起来 OP 只是将 partnerclaimtype 拼错了。不确定,因为您可能映射了一些非标准的东西,但我认为您只需将 PartnerClaimType 从group更改为groups。
<ClaimType Id="groups">
<DisplayName>Groups</DisplayName>
<DataType>stringCollection</DataType>
<DefaultPartnerClaimTypes>
<Protocol Name="OpenIdConnect" PartnerClaimType="groups" />
</DefaultPartnerClaimTypes>
<UserHelpText>List of group memberships</UserHelpText>
</ClaimType>
- 定义ClaimType 后,您无需在其他任何地方指定PartnerClaimType -除非您要覆盖该值。
- 我还考虑使用 DefaultValue="" 属性,以便您可以检查您的策略是否正确执行输出声明。
OutputClaim ClaimTypeReferenceId="groups" DefaultValue="no groups assigned
推荐阅读
- java - 是否可以使用所有片段创建应用程序?
- python - python 两种形式的矩阵x[i,j]和x[i][j]的区别
- android - Android Microsoft Translator API-获取支持翻译文本的语言时出错
- vba - Excel:当最后一列更改编号时如何获取最后一列的列索引号
- jquery - 关闭引导程序 3 模态后滚动正文
- java - 如何在我的 Gluon Mobile 项目中更改 jdk?
- python - 使用子进程从 input() 交互式运行多个命令
- c# - 使用 XAML 样式的 WPF 3d 按钮样式
- java - Selenium Java 为 element.isDisplayed 返回不正确的结果
- android - 无法启动活动 ComponentInfo。java.lang.NullPointerException:Firestore 组件不存在