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ě App Service.

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

Pro všechna jazyková rozhraní služba App Service zpřístupní deklarace identity v příchozím tokenu (ať už od ověřeného koncového uživatele nebo klientské aplikace) do kódu vložením do hlaviček požadavku. Externí požadavky nesmí tyto hlavičky nastavit, takže jsou k dispozici jenom v případě, že je nastaví služba App Service. Mezi příklady hlaviček patří:

Hlavička Popis
X-MS-CLIENT-PRINCIPAL Reprezentace dostupných deklarací identity zakódovaná ve formátu JSON s kódováním Base64 Další informace naleznete v tématu Dekódování hlavičky objektu zabezpečení klienta.
X-MS-CLIENT-PRINCIPAL-ID Identifikátor volajícího nastaveného zprostředkovatelem identity.
X-MS-CLIENT-PRINCIPAL-NAME Jméno volajícího nastaveného poskytovatelem identity, např. e-mailová adresa, hlavní název uživatele
X-MS-CLIENT-PRINCIPAL-IDP Název zprostředkovatele identity používaného ověřováním služby App Service.

Tokeny zprostředkovatele jsou také zpřístupněny prostřednictvím podobných hlaviček. Například Microsoft Entra také nastaví X-MS-TOKEN-AAD-ACCESS-TOKEN a X-MS-TOKEN-AAD-ID-TOKEN podle potřeby.

Poznámka:

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.

Kód napsaný v libovolném jazyce nebo rozhraní může získat informace, které potřebuje, z těchto hlaviček. Dekódování hlavičky objektu zabezpečení klienta tento proces pokrývá. V některých architekturách poskytuje platforma také další možnosti, které mohou být pohodlnější.

Dekódování hlavičky objektu zabezpečení klienta

X-MS-CLIENT-PRINCIPAL obsahuje úplnou sadu dostupných deklarací identity ve formátu JSON s kódováním Base64. Tyto deklarace identity procházejí výchozím procesem mapování deklarací identity, takže některé můžou mít jiné názvy, než byste viděli při přímém zpracování tokenu. Dekódovaná datová část je strukturovaná takto:

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}
Vlastnost Type Description
auth_typ string Název zprostředkovatele identity používaného ověřováním služby App Service.
claims pole objektů Pole objektů představujících dostupné deklarace identity. Každý objekt obsahuje typ a val vlastnosti.
typ string Název deklarace identity. Může se jednat o výchozí mapování deklarací identity a může se lišit od odpovídající deklarace identity obsažené v tokenu.
val string Hodnota deklarace identity.
name_typ string Typ deklarace identity názvu, což je obvykle identifikátor URI poskytující informace o schématu name o deklaraci identity, pokud je definován.
role_typ string Typ deklarace identity role, což je obvykle identifikátor URI poskytující informace o schématu role deklarace identity, pokud je definován.

Aby bylo možné tuto hlavičku zpracovat, bude vaše aplikace muset dekódovat datovou část a iterovat prostřednictvím claims pole, aby našla nároky na úroky. Může být vhodné je převést na reprezentaci používanou jazykovou architekturou aplikace. Tady je příklad tohoto procesu v jazyce C#, který vytvoří typ ClaimsPrincipal pro aplikaci, která se má použít:

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

Alternativy specifické pro architekturu

Pro ASP.NET aplikace 4.6 služba App Service naplní deklarace identityPrincipal.Current deklaracemi identity ověřeného uživatele, takže můžete postupovat podle standardního vzoru kódu .NET, včetně atributu [Authorize] . Podobně app Service pro aplikace PHP naplní proměnnou _SERVER['REMOTE_USER'] . U aplikací v Javě jsou deklarace identity přístupné ze servletu Tomcat.

Pro Azure FunctionsClaimsPrincipal.Current se pro kód .NET nenaplní, ale deklarace identity uživatelů můžete najít v hlavičce požadavku nebo získat ClaimsPrincipal objekt z kontextu požadavku nebo dokonce prostřednictvím parametru vazby. Další informace najdete v tématu Práce s identitami klientů ve službě Azure Functions.

U .NET Core podporuje Microsoft.Identity.Web naplnění aktuálního uživatele ověřováním služby App Service. Další informace najdete na wikiwebu Microsoft.Identity.Web nebo si ho můžete prohlédnout v tomto kurzu pro webovou aplikaci, která přistupuje k Microsoft Graphu.

Poznámka:

Aby mapování deklarací identity fungovalo, musíte 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é získat další podrobnosti o ověřeném uživateli voláním /.auth/me.

Další kroky