Condividi tramite


Usare le identità utente nell'autenticazione del servizio app di Azure

Questo articolo illustra come usare le identità utente quando si usano l'autenticazione e l'autorizzazione predefinite nel servizio app di Azure.

Prerequisiti

Un'applicazione Web in esecuzione nel Servizio app di Azure con il modulo di autenticazione/autorizzazione del servizio app abilitato.

Accedere alle attestazioni utente nel codice dell'app

Gli utenti finali autenticati o le applicazioni client dell'app effettuano attestazioni nei token in ingresso. Il servizio app rende le attestazioni disponibili per il codice inserendole nelle intestazioni della richiesta. Alle richieste esterne non è consentito impostare queste intestazioni, che sono quindi presenti solo se impostate dal servizio app.

È possibile usare le informazioni sulle attestazioni fornite dall'autenticazione del servizio app per eseguire i controlli di autorizzazione nel codice dell'app. Il codice in qualsiasi linguaggio o framework può ottenere informazioni necessarie dalle intestazioni della richiesta. Alcuni framework di codice offrono opzioni aggiuntive che potrebbero risultare più utili. Vedere Alternative specifiche del framework.

La tabella seguente descrive alcune intestazioni di esempio:

Intestazione Descrizione
X-MS-CLIENT-PRINCIPAL Rappresentazione JSON con codifica Base64 delle attestazioni disponibili. Per altre informazioni, vedere Decodificare l'intestazione dell'entità di sicurezza client.
X-MS-CLIENT-PRINCIPAL-ID Identificatore impostato dal provider di identità per il chiamante.
X-MS-CLIENT-PRINCIPAL-NAME Nome leggibile impostato dal provider di identità per l'identificativo del chiamante, come un indirizzo email o un nome principale utente.
X-MS-CLIENT-PRINCIPAL-IDP Nome del provider di identità usato dall'autenticazione del servizio app.

Intestazioni simili espongono token delprovider. Ad esempio, Microsoft Entra imposta X-MS-TOKEN-AAD-ACCESS-TOKEN e X-MS-TOKEN-AAD-ID-TOKEN le intestazioni del token del provider in base alle esigenze.

Note

Il servizio app rende disponibili le intestazioni di richiesta per tutti i framework del linguaggio. Framework di linguaggio diversi potrebbero presentare queste intestazioni al codice dell'app in formati diversi, ad esempio lettere minuscole o maiuscole.

Decodificare l'intestazione dell'entità client

L'intestazione X-MS-CLIENT-PRINCIPAL contiene il set completo di attestazioni disponibili in JSON con codifica Base64. Per elaborare questa intestazione, l'app deve decodificare il payload ed eseguire l'iterazione della matrice claims per trovare le attestazioni pertinenti.

Note

Queste attestazioni vengono sottoposte a un processo di mapping delle attestazioni predefinito, quindi alcuni nomi potrebbero essere diversi da quelli visualizzati nei token.

La struttura del payload decodificato è la seguente:

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

Nella tabella seguente vengono descritte le proprietà.

Proprietà Type Descrizione
auth_typ string Nome del provider di identità usato dall'autenticazione del servizio app.
claims array Matrice di oggetti che rappresentano le attestazioni disponibili. Ogni oggetto contiene proprietà typ e val.
typ string Nome dell'attestazione, che potrebbe essere soggetto al mapping delle attestazioni predefinito ed essere diverso dall'attestazione corrispondente nel token.
val string Valore dell'attestazione.
name_typ string Tipo di attestazione del nome, che in genere è un URI che fornisce informazioni sullo schema sull'attestazione name, se definita.
role_typ stringa Tipo di attestazione del ruolo, che in genere è un URI che fornisce informazioni sullo schema sull'attestazione role, se definita.

Per praticità, è possibile convertire le attestazioni in una rappresentazione usata dal framework del linguaggio dell'app. L'esempio C# seguente costruisce un ClaimsPrincipal tipo da usare per l'app.

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 });
        }

A questo punto, il codice può scorrere principal.Claims per controllare le attestazioni come parte della convalida. In alternativa, è possibile convertire principal.Claims in un oggetto standard e usarlo per eseguire tali controlli in un secondo momento nella pipeline della richiesta. È anche possibile usare tale oggetto per associare i dati utente e per altri usi.

Il resto della funzione esegue questa conversione per creare un ClaimsPrincipal oggetto che può essere usato in altro codice .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);
    }
}

Alternative specifiche del framework

Note

Per il funzionamento del mapping delle attestazioni, è necessario abilitare l'archivio token per l'app.

Accedere alle attestazioni utente usando l'API

Se l'archivio token è abilitato per l'app, è anche possibile ottenere altri dettagli sull'utente autenticato chiamando /.auth/me.