Partager via


Utiliser des identités d’utilisateur dans l’authentification Azure App Service

Cet article vous montre comment utiliser des identités utilisateur lorsque vous utilisez l’authentification et l’autorisation intégrées dans Azure App Service.

Conditions préalables

Une application web s’exécutant sur Azure App Service et pour laquelle le module d’authentification/autorisation App Service est activé

Accéder aux revendications de l’utilisateur dans le code de l’application

Les utilisateurs finaux authentifiés ou les applications clientes de votre application font des revendications dans des jetons entrants. App Service met les revendications à la disposition de votre code en les injectant dans des en-têtes de requête. Les demandes externes ne sont pas autorisées à définir ces en-têtes. Elles sont donc présentes uniquement si App Service les définit.

Vous pouvez utiliser les informations de revendications fournies par l’authentification App Service pour effectuer des vérifications d’autorisation dans votre code d’application. Le code dans n’importe quel langage ou infrastructure peut obtenir des informations nécessaires à partir des en-têtes de requête. Certaines infrastructures de code fournissent des options supplémentaires qui peuvent être plus pratiques. Consultez les alternatives spécifiques au framework.

Le tableau suivant décrit quelques exemples d’en-têtes :

En-tête Descriptif
X-MS-CLIENT-PRINCIPAL Représentation JSON encodée en base64 des revendications disponibles. Pour plus d’informations, consultez Décoder l’en-tête du principal client.
X-MS-CLIENT-PRINCIPAL-ID Identificateur défini par le fournisseur d’identité pour l’appelant.
X-MS-CLIENT-PRINCIPAL-NAME Nom lisible par l’homme que le fournisseur d’identité définit pour l’appelant, tel qu’une adresse e-mail ou un nom d’utilisateur principal.
X-MS-CLIENT-PRINCIPAL-IDP Nom du fournisseur d’identité que l’authentification App Service utilise.

Les en-têtes similaires exposent des jetons de fournisseur. Par exemple, Microsoft Entra configure les en-têtes de jeton des fournisseurs X-MS-TOKEN-AAD-ACCESS-TOKEN et X-MS-TOKEN-AAD-ID-TOKEN de manière appropriée.

Remarque

App Service rend les en-têtes de requête disponibles pour toutes les infrastructures linguistiques. Différentes infrastructures de langage peuvent présenter ces en-têtes au code d’application dans différents formats, tels que des minuscules ou des majuscules.

Décoder l’en-tête du principal du client

L'en-tête X-MS-CLIENT-PRINCIPAL contient l'ensemble complet des assertions disponibles en JSON encodé en Base64. Pour traiter cet en-tête, votre application doit décoder la charge utile et effectuer une itération dans le claims tableau pour rechercher des revendications pertinentes.

Remarque

Ces revendications sont soumises à un processus de mappage de revendications par défaut, de sorte que certains noms peuvent être différents de ceux qu’ils apparaissent dans les jetons.

La structure de charge utile décodée est la suivante :

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

Le tableau suivant décrit les propriétés.

Propriété Type Descriptif
auth_typ string Nom du fournisseur d’identité que l’authentification App Service utilise.
claims tableau Tableau d’objets qui représentent les revendications disponibles. Chaque objet contient les propriétés typ et val.
typ string Nom de la revendication, qui peut être soumis au mappage de revendications par défaut et être différent de la revendication correspondante dans le jeton.
val string Valeur de la revendication.
name_typ string Le type de revendication de nom, qui est généralement un URI fournissant des informations de schéma sur la revendication name si l’une est définie.
role_typ string Type de revendication de rôle, généralement un URI fournissant des informations sur le schéma de la role revendication, si celle-ci est définie.

Pour plus de commodité, vous pouvez convertir des revendications en une représentation que l’infrastructure de langage de l’application utilise. L’exemple C# suivant construit un ClaimsPrincipal type pour que l’application utilise.

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

À ce stade, le code peut effectuer une itération via principal.Claims pour vérifier les revendications dans le cadre de la validation. Vous pouvez également convertir principal.Claims un objet standard et l’utiliser pour effectuer ces vérifications ultérieurement dans le pipeline de requête. Vous pouvez également utiliser cet objet pour associer des données utilisateur et pour d’autres utilisations.

Le reste de la fonction effectue cette conversion pour créer un ClaimsPrincipal qui peut être utilisé dans d’autres codes .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);
    }
}

Alternatives spécifiques une infrastructure

Remarque

Pour que le mappage des revendications fonctionne, vous devez activer le magasin de jetons pour votre application.

Accéder aux revendications utilisateur à l’aide de l’API

Si le magasin de jetons est activé pour votre application, vous pouvez également appeler /.auth/me pour obtenir d’autres détails sur l’utilisateur authentifié.