Sdílet prostřednictvím


Práce s identitami uživatelů v ověřování služby Aplikace Azure

V tomto článku se dozvíte, jak pracovat s identitami uživatelů při použití integrovaného ověřování a autorizace ve službě Azure App Service.

Požadavky

Webová aplikace spuštěná ve službě Aplikace Azure, která má povolený modul ověřování/autorizace služby App Service.

Přístup k deklaracím identity uživatelů v kódu aplikace

Ověření koncoví uživatelé nebo klientské aplikace vaší aplikace vytvářejí nároky v příchozích tokenech. App Service zpřístupní identitní nároky vašemu kódu tak, že je vloží do hlaviček požadavků. Externí požadavky nesmí tyto hlavičky nastavit, protože jsou přítomny jen v případě, že je aplikace App Service nastaví.

K provedení kontrol autorizace v kódu aplikace můžete použít informace o deklaracích identity, které poskytuje ověřování v rámci služby App Service. Kód v libovolném jazyce nebo rozhraní může získat potřebné informace z hlaviček požadavku. Některé architektury kódu poskytují další možnosti, které by mohly být pohodlnější. Viz alternativy specifické pro architekturu.

Následující tabulka popisuje některé ukázkové hlavičky:

Hlavička Popis
X-MS-CLIENT-PRINCIPAL Reprezentace dostupných nároků zakódovaná ve formátu JSON ve formátu Base64. Další informace najdete v tématu Dekódování hlavičky klientského hlavního komponentu.
X-MS-CLIENT-PRINCIPAL-ID Identifikátor, který zprostředkovatel identity nastaví pro volajícího.
X-MS-CLIENT-PRINCIPAL-NAME Čitelný název, který poskytovatel identity nastaví pro volajícího, například e-mailovou adresu nebo hlavní název uživatele.
X-MS-CLIENT-PRINCIPAL-IDP Název zprostředkovatele identity používaného při ověřování služby App Service.

Podobné hlavičky zpřístupňují tokeny zprostředkovatele. Například Microsoft Entra nastaví X-MS-TOKEN-AAD-ACCESS-TOKEN a X-MS-TOKEN-AAD-ID-TOKEN hlavičky tokenu zprostředkovatele podle potřeby.

Poznámka:

App Service zpřístupňuje hlavičky požadavků všem jazykových architekturám. Různá jazyková rozhraní mohou tyto hlavičky prezentovat kódu aplikace v různých formátech, jako jsou malá písmena nebo velká písmena názvu.

Dekódování hlavičky klientského principálu

Hlavička X-MS-CLIENT-PRINCIPAL obsahuje úplnou sadu dostupných deklarací identity v kódu JSON s kódováním Base64. Aby bylo možné tuto hlavičku zpracovat, musí vaše aplikace dekódovat datovou část a procházet pole claims, aby našla relevantní nároky.

Poznámka:

Tyto nároky procházejí výchozím procesem mapování, takže některé názvy se můžou lišit od těch, které se zobrazují v tokenech.

Struktura dekódované datové části je následující:

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

Následující tabulka popisuje vlastnosti.

Vlastnictví Typ Popis
auth_typ řetězec Název zprostředkovatele identity používaného při ověřování služby App Service.
claims pole Pole objektů, které představují dostupné nároky. Každý objekt obsahuje typ a val vlastnosti.
typ řetězec Název nároku, který může podléhat výchozímu mapování nároků a může se lišit od odpovídajícího nároku v tokenu.
val řetězec Hodnota nároku.
name_typ řetězec Typ nároku na název, což je obvykle URI, které poskytuje informace o schématu nároku name, pokud je nárok definován.
role_typ řetězec Typ nároku na roli, což je obvykle URI, které poskytuje informace o schématu nároku, pokud je nějaký definován.

Pro usnadnění můžete převést deklarace identity na reprezentaci, kterou používá jazyková architektura aplikace. Následující příklad jazyka C# vytvoří ClaimsPrincipal typ, který má aplikace používat.

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

V tomto okamžiku může kód procházet principal.Claims a kontrolovat nároky jako součást ověřování. Alternativně můžete převést principal.Claims na standardní objekt a použít ho k provádění těchto kontrol později v kanálu žádosti. Tento objekt můžete také použít k přidružení uživatelských dat a k jiným účelům.

Zbytek funkce provede tento převod a vytvoří ClaimsPrincipal , který lze použít v jiném kódu .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);
    }
}

Alternativy specifické pro rámec

Poznámka:

Aby mapování identitních deklarací fungovalo, musíte pro svou aplikaci povolit úložiště tokenů.

Přístup k deklaracím identity uživatelů pomocí rozhraní API

Pokud je pro vaši aplikaci povolené úložiště tokenů , můžete také volat /.auth/me , abyste získali další podrobnosti o ověřeném uživateli.