Compartilhar 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 ao usar 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 usuários finais autenticados do aplicativo ou os aplicativos cliente fazem declarações em tokens de entrada. O Serviço de Aplicativo disponibiliza as declarações ao 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, elas só estarão presentes se o Serviço de Aplicativo os definir.

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 informações necessárias dos cabeçalhos de 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 do usuário.
X-MS-CLIENT-PRINCIPAL-IDP O nome do provedor de identidade usado pela autenticação do Serviço de Aplicativo.

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

Observação

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

Decodificar o cabeçalho da entidade de segurança do cliente

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

Observação

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

A estrutura de conteúdo decodificada é 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 O nome do provedor de identidade usado pela autenticação do Serviço de Aplicativo.
claims matriz Uma matriz de objetos que representam as declarações disponíveis. Cada objeto contém as propriedades typ e val.
typ cadeia O nome da declaração, que pode estar sujeito ao mapeamento de declarações padrão e ser diferente da declaração correspondente no token.
val cadeia O valor da declaração.
name_typ cadeia O tipo de declaração de nome, que normalmente é um URI que fornece informações de esquema sobre a declaração namese uma declaração for definida.
role_typ cadeia O tipo de declaração de função, que normalmente é um URI que fornece informações de esquema sobre a declaração rolese uma for definida.

Por conveniência, você pode converter declarações em uma representação que a estrutura de idiomas do aplicativo usa. 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 por meio de principal.Claims para verificar 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 da estrutura

Observação

Para que o mapeamento de reivindicaçõ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á chamar /.auth/me para obter outros detalhes sobre o usuário autenticado.