Partilhar via


Ponto final UserInfo

Antes de começar, use o seletor Escolha um tipo de política na parte superior desta página para escolher o tipo de política que você está configurando. O Azure Ative Directory B2C oferece dois métodos para definir como os usuários interagem com seus aplicativos: por meio de fluxos de usuário predefinidos ou por meio de políticas personalizadas totalmente configuráveis. As etapas exigidas neste artigo são diferentes para cada método.

O ponto de extremidade UserInfo faz parte da especificação padrão OpenID Connect (OIDC) e foi projetado para retornar declarações sobre o usuário autenticado. O ponto de extremidade UserInfo é definido na política de terceira parte confiável usando o elemento EndPoint .

Este recurso está disponível apenas para políticas personalizadas. Para as etapas de configuração, selecione Política personalizada no seletor anterior.

Pré-requisitos

Visão geral do ponto de extremidade UserInfo

As informações do usuário UserJourney especificam:

  • Autorização: O ponto de extremidade UserInfo é protegido com um token de portador. Um token de acesso emitido é apresentado no cabeçalho de autorização para o ponto de extremidade UserInfo. A política especifica o perfil técnico que valida o token de entrada e extrai declarações, como o objectId do usuário. O objectId do usuário é usado para recuperar as declarações a serem retornadas na resposta da jornada do ponto de extremidade UserInfo.
  • Etapa de orquestração:
    • Uma etapa de orquestração é usada para coletar informações sobre o usuário. Com base nas declarações dentro do token de acesso de entrada, a jornada do usuário invoca um perfil técnico do Microsoft Entra ID para recuperar dados sobre o usuário, por exemplo, lendo o usuário pelo objectId.
    • Etapas de orquestração opcionais - Você pode adicionar mais etapas de orquestração, como um perfil técnico da API REST para recuperar mais informações sobre o usuário.
    • UserInfo Issuer - Especifica a lista de declarações que o ponto de extremidade UserInfo retorna.

Criar um ponto de extremidade UserInfo

1. Adicione o perfil técnico do Emissor de Token

  1. Abra o arquivo TrustFrameworkExtensions.xml .

  2. Se ainda não existir, adicione um elemento ClaimsProvider e seus elementos filho como o primeiro elemento sob o elemento BuildingBlocks.

  3. Adicione o seguinte provedor de declarações:

    <!-- 
    <ClaimsProviders> -->
      <ClaimsProvider>
        <DisplayName>Token Issuer</DisplayName>
        <TechnicalProfiles>
          <TechnicalProfile Id="UserInfoIssuer">
            <DisplayName>JSON Issuer</DisplayName>
            <Protocol Name="None" />
            <OutputTokenFormat>JSON</OutputTokenFormat>
            <CryptographicKeys>
              <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
            </CryptographicKeys>
            <!-- The Below claims are what will be returned on the UserInfo Endpoint if in the Claims Bag-->
            <InputClaims>
              <InputClaim ClaimTypeReferenceId="objectId"/>
              <InputClaim ClaimTypeReferenceId="givenName"/>
              <InputClaim ClaimTypeReferenceId="surname"/>
              <InputClaim ClaimTypeReferenceId="displayName"/>
              <InputClaim ClaimTypeReferenceId="signInNames.emailAddress"/>
            </InputClaims>
          </TechnicalProfile>
          <TechnicalProfile Id="UserInfoAuthorization">
            <DisplayName>UserInfo authorization</DisplayName>
            <Protocol Name="None" />
            <InputTokenFormat>JWT</InputTokenFormat>
            <Metadata>
              <!-- Update the Issuer and Audience below -->
              <!-- Audience is optional, Issuer is required-->
              <Item Key="issuer">https://yourtenant.b2clogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/</Item>
              <Item Key="audience">[ "00001111-aaaa-2222-bbbb-3333cccc4444", "11112222-bbbb-3333-cccc-4444dddd5555" ]</Item>
              <Item Key="client_assertion_type">urn:ietf:params:oauth:client-assertion-type:jwt-bearer</Item>
            </Metadata>
            <CryptographicKeys>
              <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
            </CryptographicKeys>
            <OutputClaims>
              <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
              <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email"/>
              <!-- Optional claims to read from the access token. -->
              <!-- <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name"/>
                 <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name"/>
                 <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name"/> -->
            </OutputClaims>
          </TechnicalProfile>
        </TechnicalProfiles>
      </ClaimsProvider>
    <!-- 
    </ClaimsProviders> -->
    
  4. A seção InputClaims dentro do perfil técnico UserInfoIssuer especifica os atributos que você deseja retornar. O perfil técnico UserInfoIssuer é chamado no final da jornada do usuário.

  5. O perfil técnico UserInfoAuthorization valida a assinatura, o nome do emissor e o público do token e extrai a declaração do token de entrada. Altere os seguintes metadados para refletir seu ambiente:

    1. emissor - Este valor deve ser idêntico à iss declaração dentro da declaração de token de acesso. Os tokens emitidos pelo Azure AD B2C usam um emissor no formato https://yourtenant.b2clogin.com/your-tenant-id/v2.0/. Saiba mais sobre a personalização de tokens.

    2. IdTokenAudience - Deve ser idêntico à aud declaração dentro da declaração de token de acesso. No Azure AD B2C, a aud declaração é a ID do seu aplicativo de terceira parte confiável. Esse valor é uma coleção e suporta vários valores usando um delimitador de vírgula.

      No token de acesso a seguir, o valor da iss declaração é https://contoso.b2clogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/. O valor da aud reivindicação é 00001111-aaaa-2222-bbbb-3333cccc4444.

      {
        "exp": 1605549468,
        "nbf": 1605545868,
        "ver": "1.0",
        "iss": "https://contoso.b2clogin.com/11111111-1111-1111-1111-111111111111/v2.0/",
        "sub": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "aud": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "acr": "b2c_1a_signup_signin",
        "nonce": "defaultNonce",
        "iat": 1605545868,
        "auth_time": 1605545868,
        "name": "John Smith",
        "given_name": "John",
        "family_name": "Smith",
        "tid": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
      }
      
  6. O elemento OutputClaims do perfil técnico UserInfoAuthorization especifica os atributos que você deseja ler do token de acesso. O ClaimTypeReferenceId é a referência a um tipo de declaração. O opcional PartnerClaimType é o nome da declaração definida no token de acesso.

2. Adicione o elemento UserJourney

O elemento UserJourney define o caminho que o usuário toma ao interagir com seu aplicativo. Adicione o elemento UserJourneys se ele não existir com o UserJourney identificado como UserInfoJourney:

<!-- 
<UserJourneys> -->
  <UserJourney Id="UserInfoJourney" DefaultCpimIssuerTechnicalProfileReferenceId="UserInfoIssuer">
    <Authorization>
      <AuthorizationTechnicalProfiles>
        <AuthorizationTechnicalProfile ReferenceId="UserInfoAuthorization" />
      </AuthorizationTechnicalProfiles>
    </Authorization>
    <OrchestrationSteps >
      <OrchestrationStep Order="1" Type="ClaimsExchange">
        <Preconditions>
          <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
            <Value>objectId</Value>
            <Action>SkipThisOrchestrationStep</Action>
          </Precondition>
        </Preconditions>
        <ClaimsExchanges UserIdentity="false">
          <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
        </ClaimsExchanges>
      </OrchestrationStep>
      <OrchestrationStep Order="2" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="UserInfoIssuer" />
    </OrchestrationSteps>
  </UserJourney>
<!-- 
</UserJourneys> -->

3. Incluir o ponto de extremidade na política da terceira parte confiadora

Para incluir o ponto de extremidade UserInfo no aplicativo de terceira parte confiável, adicione um elemento Endpoint ao arquivo SocialAndLocalAccounts/SignUpOrSignIn.xml .

<!--
<RelyingParty> -->
  <Endpoints>
    <Endpoint Id="UserInfo" UserJourneyReferenceId="UserInfoJourney" />
  </Endpoints>
<!-- 
</RelyingParty> -->

O elemento de terceira parte confiadora concluído será o seguinte:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06" PolicySchemaVersion="0.3.0.0" TenantId="yourtenant.onmicrosoft.com" PolicyId="B2C_1A_signup_signin" PublicPolicyUri="http://yourtenant.onmicrosoft.com/B2C_1A_signup_signin">
  <BasePolicy>
    <TenantId>yourtenant.onmicrosoft.com</TenantId>
    <PolicyId>B2C_1A_TrustFrameworkExtensions</PolicyId>
  </BasePolicy>
  <RelyingParty>
    <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
    <Endpoints>
      <Endpoint Id="UserInfo" UserJourneyReferenceId="UserInfoJourney" />
    </Endpoints>
    <TechnicalProfile Id="PolicyProfile">
      <DisplayName>PolicyProfile</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="displayName" />
        <OutputClaim ClaimTypeReferenceId="givenName" />
        <OutputClaim ClaimTypeReferenceId="surname" />
        <OutputClaim ClaimTypeReferenceId="email" />
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
        <OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
      </OutputClaims>
      <SubjectNamingInfo ClaimType="sub" />
    </TechnicalProfile>
  </RelyingParty>
</TrustFrameworkPolicy>

4. Carregue os ficheiros

  1. Inicie sessão no portal do Azure.
  2. Se você tiver acesso a vários locatários, selecione o ícone Configurações no menu superior para alternar para seu locatário do Azure AD B2C no menu Diretórios + assinaturas .
  3. Escolha Todos os serviços no canto superior esquerdo do portal do Azure e, em seguida, procure e selecione Azure AD B2C.
  4. Selecione Identity Experience Framework.
  5. Na página Políticas personalizadas, selecione Carregar política personalizada.
  6. Selecione Substituir a política personalizada, se ela já existir, e procure e selecione o arquivo TrustframeworkExtensions.xml .
  7. Clique em Carregar.
  8. Repita as etapas 5 a 7 para o arquivo de terceira parte confiável, como SignUpOrSignIn.xml.

Chamando o ponto de extremidade UserInfo

O ponto de extremidade UserInfo usa a API de token OAuth2 Bearer padrão, chamada usando o token de acesso recebido ao obter um token para seu aplicativo. Ele retorna uma resposta JSON contendo declarações sobre o usuário. O ponto de extremidade UserInfo está hospedado no Azure AD B2C em:

https://yourtenant.b2clogin.com/yourtenant.onmicrosoft.com/policy-name/openid/v2.0/userinfo

O ponto de extremidade de configuração /.well-known (documento de descoberta do OpenID Connect) lista o userinfo_endpoint campo. Você pode descobrir programaticamente o ponto de extremidade UserInfo usando o ponto de extremidade de configuração /.well-known em:

https://yourtenant.b2clogin.com/yourtenant.onmicrosoft.com/policy-name/v2.0/.well-known/openid-configuration 

Testar a política

  1. Em Políticas personalizadas, selecione a política com a qual você integrou o ponto de extremidade UserInfo. Por exemplo, B2C_1A_SignUpOrSignIn.
  2. Selecione Executar agora.
  3. Em Selecionar aplicativo, selecione o aplicativo que você registrou anteriormente. Em Select reply url, escolha https://jwt.ms. Para obter mais informações, consulte Registrar um aplicativo Web no Azure Ative Directory B2C.
  4. Registe-se ou inicie sessão com um endereço de e-mail ou uma conta social.
  5. Copie o id_token em seu formato codificado do https://jwt.ms site. Você pode usar isso para enviar uma solicitação GET para o ponto de extremidade UserInfo e recuperar as informações do usuário.
  6. Envie uma solicitação GET para o ponto de extremidade UserInfo e recupere as informações do usuário.
GET /yourtenant.onmicrosoft.com/b2c_1a_signup_signin/openid/v2.0/userinfo
Host: b2cninja.b2clogin.com
Authorization: Bearer <your access token>

Uma resposta bem-sucedida seria semelhante a:

{
    "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    "givenName": "John",
    "surname": "Smith",
    "displayName": "John Smith",
    "signInNames.emailAddress": "john.s@contoso.com"
}

Fornecer declarações opcionais

Para fornecer mais declarações ao seu aplicativo, siga estas etapas:

  1. Adicione atributos de usuário e personalize a entrada do usuário.

  2. Modifique o elemento OutputClaims do perfil técnico da política de terceira parte confiável com as declarações que você deseja fornecer. Use o DefaultValue atributo para definir um valor padrão. Você também pode definir o valor padrão como um resolvedor de declarações, como {Context:CorrelationId}. Para forçar o uso do valor padrão, defina o AlwaysUseDefaultValue atributo como true. O exemplo a seguir adiciona a declaração de cidade com um valor padrão.

    <RelyingParty>
      ...
      <TechnicalProfile Id="PolicyProfile">
        ...
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="city" DefaultValue="Berlin" />
        </OutputClaims>
        ...
      </TechnicalProfile>
    </RelyingParty>
    
  3. Modifique o elemento InputClaims do perfil técnico UserInfoIssuer com as declarações que você deseja fornecer. Use o PartnerClaimType atributo para alterar o nome do retorno da declaração ao seu aplicativo. O exemplo a seguir adiciona a declaração de cidade e altera o nome de algumas das declarações.

    <TechnicalProfile Id="UserInfoIssuer">
      ...
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" />
        <InputClaim ClaimTypeReferenceId="city" />
        <InputClaim ClaimTypeReferenceId="givenName" />
        <InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="familyName" />
        <InputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
        <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
      </InputClaims>
      ...
    </TechnicalProfile>
    

Passos Seguintes

  • Você pode encontrar um exemplo de uma política de ponto de extremidade UserInfo no GitHub.