Arbeta med användaridentiteter i Azure App Service-autentisering
Den här artikeln visar hur du arbetar med användaridentiteter när du använder den inbyggda autentiseringen och auktoriseringen i App Service.
Åtkomst till användaranspråk i appkod
För alla språkramverk gör App Service anspråken i den inkommande token (oavsett om de kommer från en autentiserad slutanvändare eller ett klientprogram) tillgängliga för din kod genom att mata in dem i begärandehuvudena. Externa begäranden tillåts inte att ange dessa rubriker, så de finns bara om de anges av App Service. Några exempelrubriker är:
Header | beskrivning |
---|---|
X-MS-CLIENT-PRINCIPAL |
En Base64-kodad JSON-representation av tillgängliga anspråk. Mer information finns i Avkoda huvudrubriken för klienten. |
X-MS-CLIENT-PRINCIPAL-ID |
En identifierare för anroparen som angetts av identitetsprovidern. |
X-MS-CLIENT-PRINCIPAL-NAME |
Ett läsbart namn för anroparen som angetts av identitetsprovidern, till exempel e-postadress eller användarens huvudnamn. |
X-MS-CLIENT-PRINCIPAL-IDP |
Namnet på identitetsprovidern som används av App Service-autentisering. |
Providertoken exponeras också via liknande huvuden. Microsoft Entra ställer till exempel också in X-MS-TOKEN-AAD-ACCESS-TOKEN
och X-MS-TOKEN-AAD-ID-TOKEN
efter behov.
Kommentar
Olika språkramverk kan presentera dessa rubriker för appkoden i olika format, till exempel gemener eller rubrikfall.
Kod som skrivs på valfritt språk eller ramverk kan hämta den information som behövs från dessa rubriker. Avkodning av huvudrubriken för klienten täcker den här processen. För vissa ramverk tillhandahåller plattformen även extra alternativ som kan vara mer praktiska.
Avkoda huvudrubriken för klientens huvudnamn
X-MS-CLIENT-PRINCIPAL
innehåller den fullständiga uppsättningen tillgängliga anspråk som Base64-kodad JSON. Dessa anspråk genomgår en standardprocess för anspråksmappning, så vissa kan ha andra namn än du skulle se om du bearbetar token direkt. Den avkodade nyttolasten är strukturerad på följande sätt:
{
"auth_typ": "",
"claims": [
{
"typ": "",
"val": ""
}
],
"name_typ": "",
"role_typ": ""
}
Property | Type | Description |
---|---|---|
auth_typ |
sträng | Namnet på identitetsprovidern som används av App Service-autentisering. |
claims |
en matris med objekt | En matris med objekt som representerar tillgängliga anspråk. Varje objekt innehåller typ och val egenskaper. |
typ |
sträng | Namnet på anspråket. Den kan omfattas av standardmappning av anspråk och kan skilja sig från motsvarande anspråk som finns i en token. |
val |
sträng | Anspråkets värde. |
name_typ |
sträng | Namnanspråkstypen, som vanligtvis är en URI som tillhandahåller schemainformation om anspråket name om en definieras. |
role_typ |
sträng | Rollanspråkstypen, som vanligtvis är en URI som tillhandahåller schemainformation om anspråket role om en definieras. |
För att bearbeta den här rubriken måste din app avkoda nyttolasten och iterera genom matrisen claims
för att hitta anspråk av intresse. Det kan vara praktiskt att konvertera dem till en representation som används av appens språkramverk. Här är ett exempel på den här processen i C# som konstruerar en ClaimsPrincipal-typ som appen ska använda:
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);
}
}
Ramverksspecifika alternativ
För ASP.NET 4.6-appar fyller App Service i ClaimsPrincipal.Current med den autentiserade användarens anspråk, så att du kan följa standardmönstret för .NET-kod, inklusive [Authorize]
attributet. På samma sätt fyller App Service i variabeln _SERVER['REMOTE_USER']
för PHP-appar. För Java-appar är anspråken tillgängliga från Tomcat-servleten.
För Azure FunctionsClaimsPrincipal.Current
fylls inte i för .NET-kod, men du kan fortfarande hitta användaranspråken i begärandehuvudena ClaimsPrincipal
eller hämta objektet från begärandekontexten eller till och med via en bindningsparameter. Mer information finns i Arbeta med klientidentiteter i Azure Functions.
För .NET Core har Microsoft.Identity.Web stöd för att fylla den aktuella användaren med App Service-autentisering. Om du vill veta mer kan du läsa om det på wikin Microsoft.Identity.Web eller se det som visas i den här självstudien för en webbapp som har åtkomst till Microsoft Graph.
Få åtkomst till användaranspråk med hjälp av API:et
Om tokenarkivet är aktiverat för din app kan du även hämta annan information om den autentiserade användaren genom att anropa /.auth/me
.