Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel leest u hoe u met gebruikersidentiteiten kunt werken wanneer u ingebouwde verificatie en autorisatie gebruikt in Azure App Service.
Toegang tot gebruikersclaims in app-code
Voor alle taalframeworks maakt App Service de claims in het binnenkomende token (van een geverifieerde eindgebruiker of van een clienttoepassing) beschikbaar voor uw code door deze in de aanvraagheaders te injecteren. Externe aanvragen mogen deze headers niet instellen, dus ze zijn alleen aanwezig als ze zijn ingesteld door App Service.
Enkele voorbeeldheaders worden beschreven in de volgende tabel:
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 voor de beller, die door de id-provider wordt ingesteld. |
X-MS-CLIENT-PRINCIPAL-NAME |
Een door mensen leesbare naam voor de beller, ingesteld door de id-provider, zoals een e-mailadres of een user principal name. |
X-MS-CLIENT-PRINCIPAL-IDP |
De naam van de id-provider die door App Service-verificatie wordt gebruikt. |
Providertokens worden ook weergegeven via vergelijkbare headers. Microsoft Entra stelt bijvoorbeeld ook X-MS-TOKEN-AAD-ACCESS-TOKEN
en X-MS-TOKEN-AAD-ID-TOKEN
in zoals gepast.
Notitie
Verschillende programmeertaalframeworks kunnen deze headers op verschillende manieren aan de app-code presenteren, zoals in kleine letters of met een titelcase.
Code die in elke taal of framework is geschreven, kan de informatie ophalen die nodig is uit deze headers. Decodeer de client-principalheader behandelt dit proces. Voor sommige frameworks biedt het platform ook extra opties die handiger kunnen zijn.
De client-principal header decoderen
X-MS-CLIENT-PRINCIPAL
bevat de volledige set beschikbare claims als met Base64 gecodeerde JSON. Deze claims doorlopen een standaardproces voor claimtoewijzing, dus sommigen hebben mogelijk andere namen dan u zou zien als u het token rechtstreeks hebt verwerkt.
De gedecodeerde payload is als volgt gestructureerd:
{
"auth_typ": "",
"claims": [
{
"typ": "",
"val": ""
}
],
"name_typ": "",
"role_typ": ""
}
Eigenschap | Type | Beschrijving |
---|---|---|
auth_typ |
tekenreeks | De naam van de id-provider die door App Service-verificatie wordt gebruikt. |
claims |
reeks van objecten | Een matrix met objecten die de beschikbare claims vertegenwoordigen. Elk object bevat typ en val eigenschappen. |
typ |
tekenreeks | De naam van de claim. Het kan onderhevig zijn aan standaardclaimtoewijzing en kan afwijken van de bijbehorende claim die is opgenomen in een token. |
val |
tekenreeks | De waarde van de claim. |
name_typ |
tekenreeks | Het naamclaimtype, dat doorgaans een URI is die schema-informatie over de name claim biedt als er een is gedefinieerd. |
role_typ |
tekenreeks | Het rolclaimtype, dat doorgaans een URI is die schema-informatie over de role claim biedt als er een is gedefinieerd. |
Als u deze header wilt verwerken, moet uw app de nettolading decoderen en de claims
matrix doorlopen om relevante claims te vinden. Het kan handig zijn om claims te converteren naar een weergave die door het taalframework van de app wordt gebruikt. Hier volgt een voorbeeld van dit proces in C# waarmee een ClaimsPrincipal
type wordt samengesteld 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 });
}
/**
* 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);
}
}
Frameworkspecifieke alternatieven
Voor ASP.NET 4.6-apps vult App Service ClaimsPrincipal.Current
met de claims van de geverifieerde gebruiker. U kunt het standaard .NET-codepatroon volgen, inclusief het kenmerk [Authorize
]. Voor PHP-apps vult App Service de _SERVER['REMOTE_USER']
variabele ook in. Voor Java-apps zijn de claims toegankelijk vanuit de Tomcat-servlet.
Voor Azure FunctionsClaimsPrincipal.Current
is deze niet ingevuld voor .NET-code, maar u kunt de gebruikersclaims nog steeds vinden in de aanvraagheaders of het ClaimsPrincipal
object ophalen uit de aanvraagcontext of zelfs via een bindingsparameter. Zie Werken met clientidentiteiten in Azure Functions voor meer informatie.
Voor .NET Core ondersteunt Microsoft.Identity.Web
het invullen van de actuele gebruiker door middel van App Service-verificatie. Raadpleeg de wiki Microsoft.Identity.Web voor meer informatie of bekijk deze in deze zelfstudie voor een web-app die toegang heeft tot Microsoft Graph.
Notitie
Als claimtoewijzing werkt, moet u het tokenarchief inschakelen.
Toegang tot gebruikersclaims met behulp van de API
Als het tokenarchief is ingeschakeld voor uw app, kunt u ook andere gegevens over de geverifieerde gebruiker verkrijgen door aan te roepen /.auth/me
.