首页 > 解决方案 > 如何从 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);

客户端权限设置为 openid 和 allatclaims 在此处输入图像描述

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 令牌没有组声明!为什么?

标签: azureopenidazure-ad-b2c

解决方案


看起来 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


推荐阅读