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

时间:2017-10-27 07:51:24

标签: azure-ad-b2c

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

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

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

到目前为止,一切都按预期工作,testClaim作为id_token的一部分从b2c返回,但没有设置其他声明。我为策略设置了Application Insights,但B2C从不调用端点/userinfo,我在日志中看不到它的痕迹。是否支持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>

3 个答案:

答案 0 :(得分:0)

Azure AD B2C不支持userinfo_endpoint。您可以在Azure AD B2C feedback forum中请求此功能。

有两种解决方法:

  • 应用程序级别 - 添加代码,在获取id_token之后,调用此userinfo_endpoint以获取这些额外声明,并将其添加到令牌以用于其余应用程序
  • B2C自定义政策级别 - 添加callout to a Rest API以检索额外的声明并将其添加到令牌中。请注意,您将无法调用userinfo_endpoint,而是需要编写一个中间服务,该服务从B2C转换调用REST调用(它还不支持发送{ {1}}标题)调用您的userinfo_endpoint或带有额外声明的基础用户商店。

答案 1 :(得分:0)

尽管OpenIdConnect技术资料似乎不支持userinfo端点,但是您应该能够将OAuth2技术资料与ClaimsEndpoint一起使用,以从userinfo中获取声明端点

答案 2 :(得分:0)

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