Megosztás a következőn keresztül:


Felhasználói identitások használata Azure-alkalmazás szolgáltatáshitelesítésben

Ez a cikk bemutatja, hogyan használhatja a felhasználói identitásokat az App Service beépített hitelesítésének és engedélyezésének használatakor.

Felhasználói jogcímek elérése az alkalmazáskódban

Az App Service az összes nyelvi keretrendszer esetében elérhetővé teszi a bejövő jogkivonatban lévő jogcímeket (akár hitelesített végfelhasználótól, akár ügyfélalkalmazástól) a kód számára azáltal, hogy beszúrja őket a kérésfejlécekbe. A külső kérések nem állíthatják be ezeket a fejléceket, ezért csak akkor jelennek meg, ha az App Service állítja be őket. Néhány példafejléc:

Fejléc Leírás
X-MS-CLIENT-PRINCIPAL A rendelkezésre álló jogcímek Base64 kódolású JSON-ábrázolása. További információ: Az ügyfélnév fejlécének dekódolása.
X-MS-CLIENT-PRINCIPAL-ID Az identitásszolgáltató által beállított hívó azonosítója.
X-MS-CLIENT-PRINCIPAL-NAME Az identitásszolgáltató által beállított hívó személy által olvasható neve, például e-mail-cím vagy felhasználónév.
X-MS-CLIENT-PRINCIPAL-IDP Az App Service Authentication által használt identitásszolgáltató neve.

A szolgáltatói jogkivonatok hasonló fejléceken keresztül is elérhetők. Például a Microsoft Entra is beállítja X-MS-TOKEN-AAD-ACCESS-TOKEN és X-MS-TOKEN-AAD-ID-TOKEN szükség szerint.

Feljegyzés

Előfordulhat, hogy a különböző nyelvi keretrendszerek különböző formátumban jelenítik meg ezeket a fejléceket az alkalmazáskódban, például kisbetűs vagy címes ügyben.

A bármilyen nyelven vagy keretrendszerben írt kód ezekből a fejlécekből lekérheti a szükséges információkat. Az ügyfélnév fejlécének dekódolása lefedi ezt a folyamatot. Egyes keretrendszerek esetében a platform további lehetőségeket is kínál, amelyek kényelmesebbek lehetnek.

Az ügyfélnév fejlécének dekódolása

X-MS-CLIENT-PRINCIPAL A rendelkezésre álló jogcímek teljes készletét Tartalmazza Base64 kódolású JSON-ként. Ezek a jogcímek egy alapértelmezett jogcímleképezési folyamaton mennek keresztül, így előfordulhat, hogy egyes jogcímek neve eltér a jogkivonat közvetlen feldolgozásától. A dekódolt hasznos adatok a következőképpen strukturálhatók:

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}
Tulajdonság Típus Leírás
auth_typ húr Az App Service Authentication által használt identitásszolgáltató neve.
claims objektumtömb Az elérhető jogcímeket képviselő objektumtömb. Minden objektum tartalmaz typ és val tulajdonságokat.
typ húr A jogcím neve. Előfordulhat, hogy az alapértelmezett jogcímleképezés vonatkozik rá, és eltérhet a jogkivonatban található megfelelő jogcímtől.
val húr A jogcím értéke.
name_typ húr A név jogcímtípusa, amely általában egy URI, amely a jogcímre vonatkozó name sémainformációkat adja meg, ha van definiálva.
role_typ húr A szerepkör jogcímtípusa, amely általában egy URI, amely a jogcímre vonatkozó role sémainformációkat adja meg, ha van definiálva.

A fejléc feldolgozásához az alkalmazásnak dekódolnia kell a hasznos adatokat, és át kell haladnia a tömbön, claims hogy megtalálja a kívánt jogcímeket. Az alkalmazás nyelvi keretrendszere által használt reprezentációvá alakíthatja őket. Íme egy példa erre a C# folyamatra, amely egy ClaimsPrincipal típusú jogcímtípust hoz létre a használni kívánt alkalmazáshoz:

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

        /** 
         *  At this point, the code can iterate through `principal.Claims` to
         *  check claims as part of validation. Alternatively, we can convert
         *  it into a standard object with which to perform those checks later
         *  in the request pipeline. That object can also be leveraged for 
         *  associating user data, etc. The rest of this function performs such
         *  a conversion to create a `ClaimsPrincipal` as might be used in 
         *  other .NET code.
         */

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

Keretrendszerspecifikus alternatívák

A 4.6-os ASP.NET appok esetében az App Service feltölti a ClaimsPrincipal.Current szolgáltatást a hitelesített felhasználó jogcímeivel, így követheti a szabványos .NET-kódmintát, beleértve az [Authorize] attribútumot is. A PHP-alkalmazások esetében az App Service is feltölti a változót _SERVER['REMOTE_USER'] . Java-alkalmazások esetén a jogcímek a Tomcat servletből érhetők el.

Az Azure FunctionsClaimsPrincipal.Current esetében nincs feltöltve .NET-kód, de továbbra is megtalálhatja a felhasználói jogcímeket a kérés fejléceiben, vagy lekérheti az ClaimsPrincipal objektumot a kérelemkörnyezetből vagy akár egy kötési paraméteren keresztül. További információ: Ügyfélidentitások használata az Azure Functionsben.

A .NET Core esetében a Microsoft.Identity.Web támogatja az aktuális felhasználó App Service-hitelesítéssel való feltöltését. További információkért olvassa el a Microsoft.Identity.Web wikiben, vagy tekintse meg a Microsoft Graphot elérő webalkalmazások oktatóanyagában.

Feljegyzés

A jogcímleképezés működéséhez engedélyeznie kell a tokentárolót.

Felhasználói jogcímek elérése az API használatával

Ha a jogkivonat-tároló engedélyezve van az alkalmazáshoz, a hitelesített felhasználóra vonatkozó egyéb adatokat is lekértheti a hívással /.auth/me.

Következő lépések