Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo trabajar con identidades de usuario al usar la autenticación y autorización integradas en Azure App Service.
Prerrequisitos
Una aplicación web que se ejecuta en Azure App Service que tiene habilitado el módulo de autenticación y autorización de App Service.
Acceso a notificaciones de usuario en el código de la aplicación
Los usuarios finales autenticados o las aplicaciones cliente de la aplicación realizan notificaciones en tokens entrantes. App Service pone las afirmaciones a disposición de tu código al inyectarlas en los encabezados de solicitud. Las solicitudes externas no pueden establecer estos encabezados, por lo que solo están presentes si App Service los establece.
Puede usar la información de las declaraciones que proporciona la autenticación de App Service para realizar comprobaciones de autorización en el código de la aplicación. El código de cualquier lenguaje o marco puede obtener información necesaria de los encabezados de solicitud. Algunos marcos de código proporcionan opciones adicionales que podrían ser más convenientes. Consulte Alternativas específicas del marco de trabajo.
En la tabla siguiente se describen algunos encabezados de ejemplo:
| Encabezado | Descripción |
|---|---|
X-MS-CLIENT-PRINCIPAL |
Representación de JSON codificada en Base64 de las declaraciones disponibles. Para obtener más información, vea Descodificar el encabezado principal del cliente. |
X-MS-CLIENT-PRINCIPAL-ID |
Identificador que establece el proveedor de identidades para el autor de la llamada. |
X-MS-CLIENT-PRINCIPAL-NAME |
Un nombre legible que el proveedor de identidades establece para el autor de la llamada, como una dirección de correo electrónico o un nombre principal de usuario. |
X-MS-CLIENT-PRINCIPAL-IDP |
Nombre del proveedor de identidades que usa la autenticación de App Service. |
Los encabezados similares exponen tokens de proveedor. Por ejemplo, Microsoft Entra establece X-MS-TOKEN-AAD-ACCESS-TOKEN y X-MS-TOKEN-AAD-ID-TOKEN encabezados de token de proveedor según corresponda.
Nota:
App Service pone los encabezados de solicitud a disposición de todos los marcos de lenguaje. Los distintos marcos de lenguaje pueden presentar estos encabezados al código de la aplicación en formatos diferentes, como minúsculas o mayúsculas.
Descodificar el encabezado del cliente principal
El X-MS-CLIENT-PRINCIPAL encabezado contiene el conjunto completo de claims disponibles codificados en formato JSON Base64. Para procesar este encabezado, la aplicación debe descodificar la carga y recorrer en iteración la claims array para buscar reclamaciones pertinentes.
Nota:
Estas notificaciones se someten a un proceso de asignación de notificaciones predeterminado, por lo que algunos nombres pueden ser diferentes de los que aparecen en los tokens.
La estructura de carga descodificada es la siguiente:
{
"auth_typ": "",
"claims": [
{
"typ": "",
"val": ""
}
],
"name_typ": "",
"role_typ": ""
}
En la tabla siguiente se describen las propiedades.
| Propiedad | Tipo | Descripción |
|---|---|---|
auth_typ |
string | Nombre del proveedor de identidades que usa la autenticación de App Service. |
claims |
array | Un arreglo de objetos que representan las reclamaciones disponibles. Cada objeto contiene las propiedades typ y val. |
typ |
string | El nombre de la notificación, que podría estar sujeto a la asignación de notificaciones predeterminada y ser diferente de la notificación correspondiente en el token. |
val |
string | Valor de la notificación. |
name_typ |
string | El tipo de notificación de nombre, que suele ser un URI que proporciona información de esquema sobre la notificación name, en caso de que se haya definido. |
role_typ |
cadena | El tipo de notificación de rol, que suele ser un URI que proporciona información de esquema sobre la notificación role, en caso de que se haya definido. |
Para mayor comodidad, puede convertir las reclamaciones en una representación que utiliza el framework de lenguaje de la aplicación. En el ejemplo de C# siguiente se crea un ClaimsPrincipal tipo para que la aplicación la use.
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 });
}
En este punto, el código puede iterar a través de principal.Claims para comprobar las reclamaciones como parte de la validación. Como alternativa, puede convertir principal.Claims en un objeto estándar y usarlo para realizar esas comprobaciones más adelante en la canalización de solicitudes. También puede usar ese objeto para asociar datos de usuario y para otros usos.
El resto de la función realiza esta conversión para crear un ClaimsPrincipal que se puede usar en otro código de .NET.
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);
}
}
Alternativas específicas del marco
Para las aplicaciones de ASP.NET 4.6, App Service rellena
ClaimsPrincipal.Currentcon las reclamaciones del usuario autenticado. Puede seguir el patrón de código estándar de .NET, incluido el[Authorize]atributo .ClaimsPrincipal.Currentno se rellena para el código .NET en Azure Functions, pero aún puede encontrar las notificaciones de usuario en las cabeceras de solicitudes, u obtener el objetoClaimsPrincipaldel contexto de la solicitud o a través de un parámetro de enlace. Para más información, consulte Uso de identidades de cliente en Azure Functions.En el caso de las aplicaciones PHP, App Service rellena de forma similar la
_SERVER['REMOTE_USER']variable .En el caso de aplicaciones Java, las "claims" son accesibles desde el servlet de Tomcat.
Para .NET Core,
Microsoft.Identity.Webadmite la rellenación del usuario actual con la autenticación de App Service. Para más información, consulte Integración con la autenticación de Azure App Services de aplicaciones web que se ejecutan con Microsoft.Identity.Web. Para obtener una demostración de una aplicación web que accede a Microsoft Graph, consulte Tutorial: Acceso a Microsoft Graph desde una aplicación .NET protegida como usuario.
Nota:
Para que la asignación de notificaciones funcione, debe habilitar el almacén de tokens para la aplicación.
Acceso a declaraciones de usuario mediante la API
Si el almacén de tokens está habilitado para tu aplicación, también puede llamar /.auth/me para obtener otros detalles sobre el usuario autenticado.