Compartilhar via


Definir um perfil técnico RESTful em uma política personalizada do Azure Active Directory B2C

Importante

A partir de 1º de maio de 2025, o Azure AD B2C não estará mais disponível para compra para novos clientes. Saiba mais em nossas perguntas frequentes.

Observação

No Azure Active Directory B2C, as políticas personalizadas são projetadas principalmente para tratar de cenários complexos. Para a maioria dos cenários, recomendamos que você use fluxos de usuários predefinidos. Se você ainda não fez isso, saiba mais sobre o pacote de início de política personalizado em Introdução às políticas personalizadas no Active Directory B2C.

O Azure AD B2C (Azure Active Directory B2C) oferece suporte para integrar seu próprio serviço RESTful. O Azure AD B2C envia dados para o serviço RESTful em uma coleção de declarações de entrada e recebe dados de volta em uma coleção de declarações de saída. Para obter mais informações, consulte Integrar trocas de declarações da API REST em sua política personalizada do Azure AD B2C.

Protocolo

O atributo Name do elemento Protocol precisa ser definido como Proprietary. O atributo de manipulador deve conter o nome totalmente qualificado do assembly do manipulador de protocolo usado pelo Azure AD B2C: Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

O exemplo a seguir mostra um perfil técnico RESTful:

<TechnicalProfile Id="REST-UserMembershipValidator">
  <DisplayName>Validate user input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  ...

Declarações de entrada

O elemento InputClaims contém uma lista de declarações a serem enviadas para a API REST. Você também pode mapear o nome da declaração para o nome definido na API REST. O exemplo a seguir mostra o mapeamento entre sua política e a API REST. A declaração givenName é enviada à API REST como firstName, enquanto o sobrenome é enviado como lastName. A declaração de email está definida como está.

<InputClaims>
  <InputClaim ClaimTypeReferenceId="email" />
  <InputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="firstName" />
  <InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="lastName" />
</InputClaims>

O elemento InputClaimsTransformations pode conter uma coleção de elementos InputClaimsTransformation que são usados para modificar as declarações de entrada ou gerar novas antes de enviar para a API REST.

Enviar um conteúdo JSON

O perfil técnico da API REST permite que você envie uma carga JSON complexa para um ponto de extremidade.

Para enviar uma carga JSON complexa:

  1. Crie seu conteúdo JSON com a transformação de declarações GenerateJson .
  2. No perfil técnico da API REST:
    1. Adicione uma transformação de declarações de entrada com uma referência à GenerateJson transformação de declarações.
    2. Definir a opção SendClaimsIn de metadados como body
    3. Defina a opção ClaimUsedForRequestPayload de metadados como o nome da declaração que contém o conteúdo JSON.
    4. Na declaração de entrada, adicione uma referência à declaração de entrada que contém o conteúdo JSON.

O exemplo TechnicalProfile a seguir envia um email de verificação usando um serviço de email de terceiros (nesse caso, SendGrid).

<TechnicalProfile Id="SendGrid">
  <DisplayName>Use SendGrid's email API to send the code to the user</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://api.sendgrid.com/v3/mail/send</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="SendClaimsIn">Body</Item>
    <Item Key="ClaimUsedForRequestPayload">sendGridReqBody</Item>
    <Item Key="DefaultUserMessageIfRequestFailed">Cannot process your request right now, please try again later.</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_SendGridApiKey" />
  </CryptographicKeys>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="GenerateSendGridRequestBody" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="sendGridReqBody" />
  </InputClaims>
</TechnicalProfile>

Declarações de saída

O elemento OutputClaims contém uma lista de declarações retornadas pela API REST. Talvez seja necessário mapear o nome da declaração definida em sua política para o nome definido na API REST. Você também pode incluir declarações que não são retornadas pela API REST, desde que defina o DefaultValue atributo.

O elemento OutputClaimsTransformations pode conter uma coleção de elementos OutputClaimsTransformation usados para modificar as declarações de saída ou gerar novas declarações.

O exemplo a seguir mostra a declaração retornada pela API REST:

  • A declaração MembershipId mapeada para o nome da declaração loyaltyNumber .

O perfil técnico também retorna declarações que não são retornadas pelo provedor de identidade:

  • A declaração loyaltyNumberIsNew que tem um valor padrão definido como true.
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="loyaltyNumber" PartnerClaimType="MembershipId" />
  <OutputClaim ClaimTypeReferenceId="loyaltyNumberIsNew" DefaultValue="true" />
</OutputClaims>

Metadados

Atributo Obrigatório Descrição
ServiceUrl Sim A URL do ponto de extremidade da API REST.
Tipo de Autenticação Sim O tipo de autenticação que está sendo executada pelo provedor de declarações RESTful. Valores possíveis: None, , Basic, Bearer, ClientCertificateou ApiKeyHeader.
  • O None valor indica que a API REST é anônima.
  • O Basic valor indica que a API REST é protegida com autenticação básica HTTP. Somente usuários verificados, incluindo o Azure AD B2C, podem acessar sua API.
  • O ClientCertificate valor (recomendado) indica que a API REST restringe o acesso usando a autenticação de certificado do cliente. Somente os serviços que têm os certificados apropriados, por exemplo, Azure AD B2C, podem acessar sua API.
  • O Bearer valor indica que a API REST restringe o acesso usando o token de portador OAuth2 do cliente.
  • O ApiKeyHeader valor indica que a API REST é protegida com o cabeçalho HTTP da chave de API, como x-functions-key.
AllowInsecureAuthInProduction Não Indica se o AuthenticationType ambiente de produção pode ser definido none (DeploymentMode do TrustFrameworkPolicy está definido como Production, ou não especificado). Valores possíveis: true ou false (padrão).
SendClaimsIn Não Especifica como as declarações de entrada são enviadas ao provedor de declarações RESTful. Valores possíveis: Body (padrão), Formou HeaderUrlQueryString.
O Body valor é a declaração de entrada enviada no corpo da solicitação no formato JSON.
O Form valor é a declaração de entrada que é enviada no corpo da solicitação em um formato de valor de chave separado '> e '>.
O Header valor é a declaração de entrada enviada no cabeçalho da solicitação.
O Url valor é a declaração de entrada que é enviada na URL, por exemplo, https://api.example.com/{claim1}/{claim2}?{claim3}={claim4}. A parte do nome do host da URL não pode conter declarações.
O QueryString valor é a declaração de entrada enviada na cadeia de caracteres de consulta de solicitação.
Os verbos HTTP invocados por cada um são os seguintes:
  • Body:POSTAR
  • Form:POSTAR
  • Header:OBTER
  • Url:OBTER
  • QueryString:OBTER
Formato de declarações Não Não usado no momento, pode ser ignorado.
ClaimUsedForRequestPayload Não Nome de uma declaração de cadeia de caracteres que contém o conteúdo a ser enviado para a API REST.
Modo de depuração Não Executa o perfil técnico no modo de depuração. Valores possíveis: true ou false (padrão). No modo de depuração, a API REST pode retornar mais informações. Consulte a seção Retornando mensagem de erro .
IncludeClaimResolvingInClaimsHandling Não Em declarações de entrada e saída, especifica se a resolução de declarações está incluída no perfil técnico. Valores possíveis: true ou false (padrão). Se você quiser usar um resolvedor de declarações no perfil técnico, defina-o como true.
ResolveJsonPathsInJsonTokens Não Indica se o perfil técnico resolve caminhos JSON. Valores possíveis: true ou false (padrão). Use esses metadados para ler dados de um elemento JSON aninhado. Em um OutputClaim, defina o PartnerClaimType como o elemento de caminho JSON que você deseja gerar. Por exemplo: firstName.localized ou data[0].to[0].email.
UseClaimAsBearerToken Não O nome da declaração que contém o token de portador.

Tratamento de erros

Os metadados a seguir podem ser usados para configurar as mensagens de erro exibidas após a falha da API REST. A mensagem de erro pode ser localizada.

Atributo Obrigatório Descrição
DefaultUserMessageIfRequestFailed Não Uma mensagem de erro personalizada padrão para todas as exceções da API REST.
UserMessageIfCircuitOpen Não Mensagem de erro quando a API REST não estiver acessível. Se não for especificado, o DefaultUserMessageIfRequestFailed será retornado.
UserMessageIfDnsResolutionFailed Não Mensagem de erro para a exceção de resolução DNS. Se não for especificado, o DefaultUserMessageIfRequestFailed será retornado.
UserMessageIfRequestTimeout Não Mensagem de erro quando a conexão está com o tempo limite limite. Se não for especificado, o DefaultUserMessageIfRequestFailed será retornado.

Chaves criptográficas

Se o tipo de autenticação estiver definido como None, o elemento CryptographicKeys não será usado.

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">None</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
</TechnicalProfile>

Se o tipo de autenticação estiver definido como Basic, o elemento CryptographicKeys conterá os seguintes atributos:

Atributo Obrigatório Descrição
BasicAuthenticationUsername Sim O nome de usuário usado para autenticar.
BasicAuthenticationPassword Sim A senha usada para autenticar.

O exemplo a seguir mostra um perfil técnico com autenticação básica:

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">Basic</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_B2cRestClientId" />
    <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_B2cRestClientSecret" />
  </CryptographicKeys>
</TechnicalProfile>

Se o tipo de autenticação estiver definido como ClientCertificate, o elemento CryptographicKeys conterá o seguinte atributo:

Atributo Obrigatório Descrição
Certificado do Cliente Sim O certificado X509 (conjunto de chaves RSA) a ser usado para autenticar.
<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">ClientCertificate</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="ClientCertificate" StorageReferenceId="B2C_1A_B2cRestClientCertificate" />
  </CryptographicKeys>
</TechnicalProfile>

Se o tipo de autenticação estiver definido como Bearer, o elemento CryptographicKeys conterá o seguinte atributo:

Atributo Obrigatório Descrição
BearerAuthenticationToken Não O token de portador OAuth 2.0.
<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_B2cRestClientAccessToken" />
  </CryptographicKeys>
</TechnicalProfile>

Se o tipo de autenticação estiver definido como ApiKeyHeader, o elemento CryptographicKeys conterá o seguinte atributo:

Atributo Obrigatório Descrição
O nome do cabeçalho HTTP, como x-functions-key, ou x-api-key. Sim A chave usada para autenticar.

Observação

Neste momento, o Azure AD B2C dá suporte a apenas um cabeçalho HTTP para autenticação. Se sua chamada RESTful exigir vários cabeçalhos, como uma ID do cliente e um valor de segredo do cliente, você precisará fazer proxy da solicitação de alguma maneira.

<TechnicalProfile Id="REST-API-SignUp">
  <DisplayName>Validate user's input data and return loyaltyNumber claim</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-app-name.azurewebsites.NET/api/identity/signup</Item>
    <Item Key="AuthenticationType">ApiKeyHeader</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="x-functions-key" StorageReferenceId="B2C_1A_RestApiKey" />
  </CryptographicKeys>
</TechnicalProfile>

Retornando mensagem de erro de validação

Sua API REST pode precisar retornar uma mensagem de erro, como "O usuário não foi encontrado no sistema CRM". Se ocorrer um erro, a API REST deverá retornar uma mensagem de erro HTTP 4xx, como 400 (solicitação incorreta) ou 409 (conflito) código de status de resposta. O corpo da resposta contém uma mensagem de erro formatada em JSON:

{
  "version": "1.0.0",
  "status": 409,
  "code": "API12345",
  "requestId": "50f0bd91-2ff4-4b8f-828f-00f170519ddb",
  "userMessage": "Message for the user",
  "developerMessage": "Verbose description of problem and how to fix it.",
  "moreInfo": "https://restapi/error/API12345/moreinfo"
}
Atributo Obrigatório Descrição
versão Sim Sua versão da API REST. Por exemplo: 1.0.1
estado Sim Um número semelhante a códigos de status de resposta HTTP e deve ser 409. Seu serviço REST pode retornar um código de status HTTP 4XX, mas o valor do status arquivo no corpo da resposta formatado por JSON deve ser 409.
código Não Um código de erro do provedor de ponto de extremidade RESTful, que é exibido quando DebugMode está habilitado.
ID do pedido Não Um identificador de solicitação do provedor de ponto de extremidade RESTful, que é exibido quando DebugMode está habilitado.
mensagem do usuário Sim Uma mensagem de erro mostrada ao usuário.
mensagem do desenvolvedor Não A descrição detalhada do problema e como corrigi-lo, que é exibido quando DebugMode está habilitado.
mais informações Não Um URI que aponta para informações adicionais, que são exibidas quando DebugMode habilitadas.

O exemplo a seguir mostra uma classe C# que retorna uma mensagem de erro:

public class ResponseContent
{
  public string Version { get; set; }
  public int Status { get; set; }
  public string Code { get; set; }
  public string UserMessage { get; set; }
  public string DeveloperMessage { get; set; }
  public string RequestId { get; set; }
  public string MoreInfo { get; set; }
}

Próximas etapas

Consulte os seguintes artigos para obter exemplos de como usar um perfil técnico RESTful: