Práce s identitami uživatelů při ověřování Azure App Service
V tomto článku se dozvíte, jak pracovat s identitami uživatelů při použití integrovaného ověřování a autorizace v App Service.
Přístup k deklaracím identity uživatelů v kódu aplikace
Pro všechna jazyková rozhraní App Service zpřístupní deklarace identity v příchozím tokenu (ať už od ověřeného koncového uživatele nebo klientské aplikace) vašemu kódu tak, že je vloží do hlaviček požadavku. Externí požadavky nemají povolené tyto hlavičky nastavovat, takže jsou k dispozici jenom v případě, že je to nastaví App Service. Mezi příklady hlaviček patří:
Hlavička | Description |
---|---|
X-MS-CLIENT-PRINCIPAL |
Reprezentace dostupných deklarací identity v kódování Base64 ve formátu JSON. Další informace najdete 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 |
Uživatelsky čitelný název volajícího nastaveného zprostředkovatelem identity, například Email Adresa, Hlavní název uživatele. |
X-MS-CLIENT-PRINCIPAL-IDP |
Název zprostředkovatele identity používaného ověřováním App Service. |
Tokeny zprostředkovatelů se také zveřejňují prostřednictvím podobných hlaviček. Zprostředkovatel identity Microsoftu například také podle potřeby nastaví X-MS-TOKEN-AAD-ACCESS-TOKEN
a X-MS-TOKEN-AAD-ID-TOKEN
.
Poznámka
Rozhraní různých jazyků mohou tyto hlavičky kódu aplikace prezentovat 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 architektuře může z těchto hlaviček získat potřebné informace. Tento proces pokrývá dekódování hlavičky objektu zabezpečení klienta. U některých architektur nabízí 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é z nich 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 | Typ | Description |
---|---|---|
auth_typ |
řetězec | Název zprostředkovatele identity používaného ověřováním App Service. |
claims |
pole objektů | Pole objektů představujících dostupné deklarace identity. Každý objekt obsahuje typ vlastnosti a val . |
typ |
řetězec | Název deklarace identity. Tato deklarace může podléhat mapování výchozích deklarací identity a může se lišit od odpovídající deklarace identity obsažené v tokenu. |
val |
řetězec | Hodnota deklarace identity. |
name_typ |
řetězec | Typ deklarace identity názvu, což je obvykle identifikátor URI poskytující informace o schématu name deklarace identity, pokud je definován. |
role_typ |
řetězec | Typ deklarace identity role, což je obvykle identifikátor URI poskytující informace o schématu role deklarace identity, pokud je definována. |
Ke zpracování této hlavičky bude vaše aplikace muset dekódovat datovou část a iterovat polem claims
, aby našla nároky zájmu. 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ý pro aplikaci vytvoří typ ClaimsPrincipal :
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
U aplikací ASP.NET 4.6 App Service vyplní ClaimsPrincipal.Current deklaracemi identity ověřeného uživatele, abyste mohli postupovat podle standardního vzoru kódu .NET, včetně atributu [Authorize]
. Podobně u aplikací PHP App Service naplní proměnnou _SERVER['REMOTE_USER']
. U aplikací v Javě jsou deklarace identity přístupné ze servletu Tomcat.
Pro Azure FunctionsClaimsPrincipal.Current
se kód .NET nevyplní, 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ů v Azure Functions.
Pro .NET Core podporuje Microsoft.Identity.Web naplnění aktuálního uživatele App Service ověřováním. Další informace si můžete přečíst na wikiwebu Microsoft.Identity.Web nebo si to 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 úložiště tokenů pro vaši aplikaci povolené, můžete také získat další podrobnosti o ověřeném uživateli voláním /.auth/me
.