【问题标题】:How to get claims from OpenID Connect provider in Azure AD B2C如何从 Azure AD B2C 中的 OpenID Connect 提供程序获取声明
【发布时间】:2017-10-27 07:51:24
【问题描述】:

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

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

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

到目前为止,一切都按预期工作,testClaim 作为 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


    【解决方案1】:

    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 调用(尚不支持发送 @ 987654324@ 标头)调用您的 userinfo_endpoint 或带有额外声明的底层用户存储。

    【讨论】:

      【解决方案2】:

      虽然OpenIdConnect Technical Profile 似乎不支持 userinfo 端点,但您应该能够将 OAuth2 Technical Profile 与 ClaimsEndpoint 一起使用从 userinfo 端点获取声明

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我已经准备好在这件事上犯错了,但在我看来,这个链接是关于将 userinfo 端点暴露给依赖方的。我认为 OP 是在询问 Azure 作为从另一个提供商获取用户信息的依赖方。
        • 是的,链接是关于暴露用户信息端点的。想知道在 2022 年,如果 idp 未在 id/access 令牌中提供任何声明但在 userinfo 端点上提供它们,那么依赖方是否有可能从另一个提供商获取用户信息并将其添加到访问令牌中?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多