Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
Pour les applications ASP.NET 4.6, App Service remplit
ClaimsPrincipal.Currentavec les déclarations de l’utilisateur authentifié. Vous pouvez suivre le modèle de code .NET standard, y compris l’attribut[Authorize].ClaimsPrincipal.Currentn’est pas rempli pour le code .NET dans Azure Functions, mais vous pouvez toujours trouver les revendications utilisateur dans les en-têtes de requête, ou obtenir l’objetClaimsPrincipalà partir du contexte de la requête ou via un paramètre de liaison. Pour plus d’informations, consultez Utiliser des identités clientes dans Azure Functions.Pour les applications PHP, App Service remplit de la même façon la
_SERVER['REMOTE_USER']variable.Pour les applications Java, les revendications sont accessibles à partir du servlet Tomcat.
Pour .NET Core,
Microsoft.Identity.Webprend en charge le remplissage de l’utilisateur actuel à l’aide de l’authentification App Service. Pour plus d’informations, consultez Intégration à l’authentification Azure App Services des applications web s’exécutant avec Microsoft.Identity.Web. Pour une démonstration d’une application web accédant à Microsoft Graph, consultez Tutoriel : Accéder à Microsoft Graph à partir d’une application .NET sécurisée en tant qu’utilisateur.
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é.