Partilhar via


Trabalhar com identidades de usuário na autenticação do Serviço de Aplicativo do Azure

Este artigo mostra como trabalhar com identidades de usuário quando você usa autenticação e autorização internas no Serviço de Aplicativo do Azure.

Pré-requisitos

Um aplicativo Web em execução no Serviço de Aplicativo do Azure que tem o módulo de autenticação/autorização do Serviço de Aplicativo habilitado.

Acessar declarações de usuário no código do aplicativo

Os utilizadores finais autenticados ou aplicações cliente do seu aplicativo apresentam reivindicações nos tokens recebidos. O Serviço de Aplicativo disponibiliza as declarações para seu código injetando-as em cabeçalhos de solicitação. As solicitações externas não têm permissão para definir esses cabeçalhos, portanto, eles estão presentes apenas se o Serviço de Aplicativo defini-los.

Você pode usar as informações de declarações que a autenticação do Serviço de Aplicativo fornece para executar verificações de autorização no código do aplicativo. O código em qualquer linguagem ou estrutura pode obter as informações necessárias dos cabeçalhos da solicitação. Algumas estruturas de código fornecem opções extras que podem ser mais convenientes. Consulte Alternativas específicas do framework.

A tabela a seguir descreve alguns cabeçalhos de exemplo:

Cabeçalho Descrição
X-MS-CLIENT-PRINCIPAL Uma representação JSON codificada em Base64 de declarações disponíveis. Para obter mais informações, consulte Decodificar o cabeçalho principal do cliente.
X-MS-CLIENT-PRINCIPAL-ID Um identificador que o provedor de identidade define para o chamador.
X-MS-CLIENT-PRINCIPAL-NAME Um nome legível por humanos que o provedor de identidade define para o chamador, como um endereço de e-mail ou nome principal de usuário.
X-MS-CLIENT-PRINCIPAL-IDP O nome do provedor de identidade que a autenticação do Serviço de Aplicativo usa.

Cabeçalhos semelhantes expõem tokens de provedor. Por exemplo, o Microsoft Entra define os cabeçalhos de token de provedor X-MS-TOKEN-AAD-ACCESS-TOKEN e X-MS-TOKEN-AAD-ID-TOKEN conforme apropriado.

Nota

O Serviço de Aplicativo disponibiliza os cabeçalhos de solicitação para todas as estruturas de linguagem. Diferentes estruturas de linguagem podem apresentar esses cabeçalhos ao código do aplicativo em formatos diferentes, como minúsculas ou minúsculas.

Decodificar o cabeçalho principal do cliente

O X-MS-CLIENT-PRINCIPAL cabeçalho contém o conjunto completo de declarações disponíveis em JSON codificado em Base64. Para processar esse cabeçalho, seu aplicativo deve decodificar a carga útil e iterar através da claims matriz para encontrar declarações relevantes.

Nota

Essas declarações passam por um processo de mapeamento de declarações padrão, portanto, alguns nomes podem ser diferentes do que aparecem nos tokens.

A estrutura de carga útil descodificada é a seguinte:

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}

A tabela a seguir descreve as propriedades.

Propriedade Tipo Descrição
auth_typ cadeia (de caracteres) O nome do provedor de identidade que a autenticação do Serviço de Aplicativo usa.
claims matriz Uma matriz de objetos que representam as declarações disponíveis. Cada objeto contém typ e val propriedades.
typ cadeia (de caracteres) O nome da declaração, que pode estar sujeita ao mapeamento de declarações padrão e ser diferente da declaração correspondente no token.
val cadeia (de caracteres) O valor da afirmação.
name_typ cadeia (de caracteres) O tipo de declaração de nome, que normalmente é um URI que fornece informações de esquema sobre a name declaração, se uma for definida.
role_typ cadeia (de caracteres) O tipo de declaração de função, que normalmente é um URI que fornece informações de esquema sobre a role declaração, se uma for definida.

Por conveniência, você pode converter declarações em uma representação usada pela estrutura de linguagem do aplicativo. O exemplo de C# a seguir constrói um ClaimsPrincipal tipo para o aplicativo usar.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;

public static class ClaimsPrincipalParser
{
    private class ClientPrincipalClaim
    {
        [JsonPropertyName("typ")]
        public string Type { get; set; }
        [JsonPropertyName("val")]
        public string Value { get; set; }
    }

    private class ClientPrincipal
    {
        [JsonPropertyName("auth_typ")]
        public string IdentityProvider { get; set; }
        [JsonPropertyName("name_typ")]
        public string NameClaimType { get; set; }
        [JsonPropertyName("role_typ")]
        public string RoleClaimType { get; set; }
        [JsonPropertyName("claims")]
        public IEnumerable<ClientPrincipalClaim> Claims { get; set; }
    }

    public static ClaimsPrincipal Parse(HttpRequest req)
    {
        var principal = new ClientPrincipal();

        if (req.Headers.TryGetValue("x-ms-client-principal", out var header))
        {
            var data = header[0];
            var decoded = Convert.FromBase64String(data);
            var json = Encoding.UTF8.GetString(decoded);
            principal = JsonSerializer.Deserialize<ClientPrincipal>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
        }

Neste ponto, o código pode iterar para principal.Claims verificar as declarações como parte da validação. Como alternativa, você pode converter principal.Claims em um objeto padrão e usá-lo para fazer essas verificações posteriormente no pipeline de solicitação. Você também pode usar esse objeto para associar dados do usuário e para outros usos.

O restante da função executa essa conversão para criar um ClaimsPrincipal que pode ser usado em outro código .NET.

        var identity = new ClaimsIdentity(principal.IdentityProvider, principal.NameClaimType, principal.RoleClaimType);
        identity.AddClaims(principal.Claims.Select(c => new Claim(c.Type, c.Value)));
        
        return new ClaimsPrincipal(identity);
    }
}

Alternativas específicas ao quadro

Nota

Para que o mapeamento de declarações funcione, você deve habilitar o armazenamento de tokens para seu aplicativo.

Acessar declarações de usuário usando a API

Se o repositório de tokens estiver habilitado para seu aplicativo, você também poderá ligar /.auth/me para obter outros detalhes sobre o usuário autenticado.