如何从 Azure AD B2C 中的 OpenID Connect 提供商处获取声明

How to get claims from OpenID Connect provider in Azure AD B2C

我在从具有 Azure AD B2C 自定义策略的 OpenID Connect 提供商处获取声明时遇到一些问题。

我的 OIDC 提供商没有 return id_token 中的任何声明,它有一个名为 userInfo_endpoint 的声明的单独端点,您可以在其中发送带有 Bearer 身份验证的 GET 请求和 access_token 以 json 格式获取用户声明。我知道这是非常标准的 OIDC 功能。

我看到的大多数示例都使用 ClaimsEndpoint 来获取声明,在我看来,声明是作为 signin_signup 用户旅程的一部分添加到用户的。

到目前为止,一切都按预期工作,testClaim return作为 id_token 的一部分从 b2c 编辑而来,但未设置其他声明。我为该策略设置了 Application Insights,但端点 /userinfo 从未被 B2C 调用,而且我在日志中看不到它的踪迹。甚至支持 OIDC /userinfo 端点吗?

下面是我的索赔提供商部分。

<ClaimsProvider>
  <DisplayName>Provider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="provider-oidc">
      <DisplayName>Providerprofile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputTokenFormat>JWT</OutputTokenFormat>
      <Metadata>
        <Item Key="client_id">preprod-provider</Item>
        <Item Key="scope">openid profile</Item>
        <Item Key="response_types">code</Item>
        <Item Key="METADATA">https://preprod.provider.com/oidc/.well-known/openid-configuration</Item>
        <Item Key="ProviderName">https://preprod.provider.com/oidc</Item>

        <Item Key="state">123abc</Item>
        <Item Key="HttpBinding">POST</Item>

        <Item Key="UsePolicyInRedirectUri">true</Item>
        <Item Key="authorization_endpoint">https://preprod.provider.com/oidc/authorize</Item>
        <Item Key="token_endpoint">https://preprod.provider.com/oidc/token</Item>
        <Item Key="ClaimsEndpoint">https://preprod.provider.com/oidc/userinfo</Item>
        <Item Key="ClaimsEndpointAccessTokenName">oauth2_access_token</Item>
        <Item Key="ClaimsResponseFormat">json</Item>

        <!--Item Key="userinfo_endpoint">https://preprod.provider.com/oidc/userinfo</Item-->
      </Metadata>
      <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_ProviderClientSecret" />
      </CryptographicKeys>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="sub"/>
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="providerAuthentication" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="provider" />
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
        <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
        <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
        <OutputClaim ClaimTypeReferenceId="testClaim" DefaultValue="testValue" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
      </OutputClaimsTransformations>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Azure AD B2C 不支持 userinfo_endpoint. 您可以在 Azure AD B2C feedback forum.

中请求此功能

有两种解决方法:

  • 应用程序级别 - 添加代码,在获得 id_token 后调用此 userinfo_endpoint 以获取这些额外声明并添加它们应用程序的其余部分可以利用的令牌
  • B2C 自定义策略级别 - 添加一个 callout to a Rest API 以检索额外声明并将它们添加到令牌中。请注意,您将无法调用 userinfo_endpoint,而是需要编写一个 in-between 服务来转换来自 B2C 的调用 REST 调用(尚不支持将 Authorization: Bearer X header) 发送到对您的 userinfo_endpoint 或具有额外声明的基础用户存储的调用中。

虽然 OpenIdConnect 技术配置文件似乎不支持 userinfo 端点,但您应该能够将 OAuth2 技术配置文件与 ClaimsEndpoint 一起使用以从用户信息端点

ADB2C 现在支持 user_info 端点。请参阅 https://docs.microsoft.com/en-us/azure/active-directory-b2c/userinfo-endpoint?pivots=b2c-custom-policy 了解更多信息。