Delen via


Werken met gebruikersidentiteiten in Azure-app Service-verificatie

In dit artikel leest u hoe u met gebruikersidentiteiten kunt werken wanneer u ingebouwde verificatie en autorisatie gebruikt in Azure App Service.

Vereiste voorwaarden

Een webtoepassing die wordt uitgevoerd in Azure App Service waarvoor de module App Service-verificatie/-autorisatie is ingeschakeld.

Toegang tot gebruikersclaims in app-code

De eindgebruikers en clienttoepassingen van uw app die geverifieerd zijn, leggen claims vast in tokens die binnenkomen. App Service maakt de claims beschikbaar voor uw code door ze in aanvraagheaders te injecteren. Externe aanvragen mogen deze headers niet instellen, dus ze zijn alleen aanwezig als App Service ze instelt.

U kunt de claimgegevens gebruiken die App Service-verificatie biedt om autorisatiecontroles uit te voeren in uw app-code. Code in elke taal of framework kan de benodigde informatie ophalen uit de aanvraagheaders. Sommige codeframeworks bieden extra opties die handiger kunnen zijn. Zie frameworkspecifieke alternatieven.

In de volgende tabel worden enkele voorbeeldheaders beschreven:

Koptekst Beschrijving
X-MS-CLIENT-PRINCIPAL Een met Base64 gecodeerde JSON-weergave van beschikbare claims. Zie De client-principalheader decoderen voor meer informatie.
X-MS-CLIENT-PRINCIPAL-ID Een id die door de id-provider wordt ingesteld voor de beller.
X-MS-CLIENT-PRINCIPAL-NAME Een door mensen leesbare naam die door de id-provider wordt ingesteld voor de beller, zoals een e-mailadres of user principal name.
X-MS-CLIENT-PRINCIPAL-IDP De naam van de id-provider die door App Service-verificatie wordt gebruikt.

Vergelijkbare headers maken providertokens beschikbaar. Microsoft Entra stelt de X-MS-TOKEN-AAD-ACCESS-TOKEN- en X-MS-TOKEN-AAD-ID-TOKEN-headers voor het providertoken in, indien van toepassing.

Notitie

App Service maakt de aanvraagheaders beschikbaar voor alle taalframeworks. Verschillende taalframeworks kunnen deze headers presenteren aan de app-code in verschillende indelingen, zoals kleine letters of titelcases.

De client-principal header decoderen

De X-MS-CLIENT-PRINCIPAL header bevat de volledige set beschikbare claims in JSON met Base64-codering. Als u deze header wilt verwerken, moet uw app de nettolading decoderen en de claims matrix doorlopen om relevante claims te vinden.

Notitie

Deze claims ondergaan een standaard claimtoewijzingsproces, dus sommige namen kunnen afwijken van die in de tokens.

De ontcijferde payloadstructuur is als volgt:

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

In de volgende tabel worden de eigenschappen beschreven.

Vastgoed Type Beschrijving
auth_typ string De naam van de id-provider die door App Service-verificatie wordt gebruikt.
claims gegevensreeks Een matrix met objecten die de beschikbare claims vertegenwoordigen. Elk object bevat typ en val eigenschappen.
typ string De naam van de claim, die mogelijk onderhevig is aan standaardclaimtoewijzing en verschilt van de bijbehorende claim in het token.
val string De waarde van de claim.
name_typ string Het naamclaimtype, dat doorgaans een URI is die schema-informatie over de name claim biedt als er een is gedefinieerd.
role_typ string Het rolclaimtype, dat doorgaans een URI is die schema-informatie over de role claim biedt als er een is gedefinieerd.

Voor het gemak kunt u claims converteren naar een weergave die door het taalframework van de app wordt gebruikt. In het volgende C#-voorbeeld wordt een ClaimsPrincipal type gemaakt dat de app kan gebruiken.

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

Op dit moment kan de code principal.Claims doorlopen om claims te controleren als onderdeel van de validatie. U kunt ook converteren principal.Claims naar een standaardobject en dit gebruiken om deze controles later in de aanvraagpijplijn uit te voeren. U kunt dat object ook gebruiken om gebruikersgegevens en andere toepassingen te koppelen.

De rest van de functie voert deze conversie uit om een ClaimsPrincipal te maken die kan worden gebruikt in andere .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);
    }
}

Frameworkspecifieke alternatieven

Notitie

Opdat claimtoewijzing werkt, moet u de tokenopslag voor uw app inschakelen.

Toegang tot gebruikersclaims met behulp van de API

Als het tokenarchief is ingeschakeld voor uw app, kunt u ook /.auth/me aanroepen om andere gegevens over de geauthenticeerde gebruiker te verkrijgen.