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.

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 z klientské aplikace) do kódu vložením do hlaviček požadavku. External requests aren't allowed to set these headers, so they're present only if set by App Service.

Některé ukázkové hlavičky jsou popsány v následující tabulce:

Hlavička Popis
X-MS-CLIENT-PRINCIPAL Reprezentace dostupných nároků zakódovaná ve formátu JSON ve formátu Base64. For more information, see Decode the client principal header.
X-MS-CLIENT-PRINCIPAL-ID Identifikátor volajícího, který nastaví poskytovatel identity.
X-MS-CLIENT-PRINCIPAL-NAME Srozumitelné pro člověka jméno volajícího, které nastavil zprostředkovatel identity, například e-mailová adresa nebo uživatelské hlavní jméno.
X-MS-CLIENT-PRINCIPAL-IDP Název zprostředkovatele identity používaného při ověřování 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í můžou tyto hlavičky prezentovat kódu aplikace v různých formátech, například malými písmeny nebo pomocí písmen názvu.

Kód napsaný v libovolném jazyce nebo rozhraní může získat informace, které potřebuje, z těchto hlaviček. Decode the client principal header covers this process. V některých architekturách poskytuje platforma také další možnosti, které by mohly být pohodlnější.

Decode the client principal header

X-MS-CLIENT-PRINCIPAL obsahuje úplnou sadu dostupných nároků ve formátu JSON s kódováním Base64. These claims go through a default claims-mapping process, so some might have different names than you would see if you processed the token directly.

Takto je dekódovaná datová část strukturovaná:

{
    "auth_typ": "",
    "claims": [
        {
            "typ": "",
            "val": ""
        }
    ],
    "name_typ": "",
    "role_typ": ""
}
Property Typ Popis
auth_typ string Název zprostředkovatele identity používaného při ověřování služby App Service.
claims pole objektů Pole objektů, které představují dostupné nároky. Každý objekt obsahuje typ a val vlastnosti.
typ string Název nároku. Může se jednat o výchozí mapování nároků a může se lišit od odpovídajícího nároku obsaženého v tokenu.
val string Hodnota nároku.
name_typ string The name claim type, which is typically a URI that provides scheme information about the name claim if one is defined.
role_typ string The role claim type, which is typically a URI that provides scheme information about the role claim if one is defined.

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. Může být vhodné převést deklarace identity na reprezentaci, kterou používá jazyková architektura aplikace. Tady je příklad tohoto procesu v jazyce C#, který vytvoří ClaimsPrincipal typ, který bude 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 });
        }

        /** 
         *  At this point, the code can iterate through `principal.Claims` to
         *  check claims as part of validation. Alternatively, you 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, and so on. 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);
    }
}

Framework-specific alternatives

V případě ASP.NET aplikací 4.6 služba App Service naplní ClaimsPrincipal.Current deklaracemi identity ověřeného uživatele. 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 nároky přístupné ze servletu Tomcat.

For Azure Functions, ClaimsPrincipal.Current isn't populated for .NET code, but you can still find the user claims in the request headers, or get the ClaimsPrincipal object from the request context or even through a binding parameter. Další informace najdete v tématu Práce s identitami klientů ve službě Azure Functions.

For .NET Core, Microsoft.Identity.Web supports populating the current user with App Service authentication. 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í nároků 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.