Configuración de una aplicación para confiar en una identidad administrada (versión preliminar)
En este artículo se describe cómo configurar una aplicación de Microsoft Entra para confiar en una identidad administrada. A continuación, puede intercambiar el token de identidad administrada para un token de acceso que pueda acceder a los recursos protegidos de Microsoft Entra sin necesidad de usar ni administrar secretos de aplicación.
Prerrequisitos
- Una cuenta de Azure con una suscripción activa. Crear una cuenta de forma gratuita.
- Esta cuenta de Azure debe tener permisos para administrar aplicaciones, específicamente para actualizar permisos. Cualquiera de los siguientes roles de Microsoft Entra incluye los permisos necesarios:
- Descripción de los conceptos de identidades administradas para recursos de Azure.
- Una identidad administrada asignada por el usuario asignada al recurso de proceso de Azure (por ejemplo, una máquina virtual o Azure App Service) que hospeda la carga de trabajo.
- Un registro de aplicación en Microsoft Entra ID. Este registro de aplicación debe pertenecer al mismo inquilino que la identidad administrada.
- Si necesita acceder a los recursos de otro inquilino, el registro de la aplicación debe ser una aplicación multiinquilino y aprovisionar la aplicación en el otro inquilino. Además, debe conceder permisos de acceso a la aplicación en los recursos de ese inquilino. Obtenga información sobre cómo agregar una aplicación multiinquilino en otros inquilinos
- El registro de la aplicación debe tener acceso concedido a los recursos protegidos de Microsoft Entra (por ejemplo, Azure, Microsoft Graph, Microsoft 365, etc.). Este acceso se puede conceder a través de permisos de API o permisos delegados .
Consideraciones y restricciones importantes
Para crear, actualizar o eliminar una credencial de identidad federada, la cuenta que realiza la acción debe tener el rol administrador de aplicaciones de , desarrollador de aplicaciones, Administrador de aplicaciones en la nubeo Propietario de la aplicación. El permiso microsoft.directory/applications/credentials/update es necesario para actualizar una credencial de identidad federada.
Se pueden agregar un máximo de 20 credenciales de identidad federada a una aplicación o a una identidad administrada asignada por el usuario.
Al configurar una credencial de identidad federada, hay varios fragmentos importantes de información que proporcionar:
emisor y sujeto son los elementos clave de información necesarios para configurar la relación de confianza. La combinación de
issuer
ysubject
debe ser única en la aplicación. Cuando la carga de trabajo de Azure solicita una plataforma de identidad de Microsoft para intercambiar el token de identidad administrada por un token de acceso, los valores de emisor y sujeto de la credencial de identidad federada se comprueban con las notificacionesissuer
ysubject
proporcionadas en el token de identidad administrada. Si se supera esa comprobación de validación, la plataforma de identidad de Microsoft emite un token de acceso a la carga de trabajo de software externo.El emisor es la dirección URL de la URL de autoridad del inquilino de Microsoft Entra con el formato
https://login.microsoftonline.com/{tenant}/v2.0
. La aplicación Microsoft Entra y la identidad administrada deben pertenecer al mismo inquilino. Si la reclamaciónissuer
tiene espacios en blanco iniciales o finales en el valor, se bloquea el intercambio de tokens.Importante
Aunque el registro de la aplicación y la identidad administrada deben estar en el mismo inquilino, la entidad de servicio del registro de la aplicación aún puede canjear el token de identidad administrada.
El sujeto es el GUID del identificador de objeto (id. de entidad de seguridad) de la identidad administrada asignada a la carga de trabajo de Azure. La plataforma de identidad de Microsoft examina el token externo entrante y rechaza el intercambio de un token de acceso si el campo de sujeto configurado en la credencial de identidad federada no coincide con el identificador de entidad de seguridad de la identidad administrada. El GUID distingue mayúsculas de minúsculas.
-
Importante
Solo puede usar identidades administradas asignadas por el usuario en esta característica.
* audiencias muestra los valores que pueden aparecer en el token externo (obligatorio). Debe agregar un único valor de audiencia, que tiene un límite de 600 caracteres. El valor debe ser uno de los siguientes y debe coincidir con el valor de la afirmación
aud
en el token de identidad administrada.- Nube pública:
api://AzureADTokenExchange
- Fairfax:
api://AzureADTokenExchangeUSGov
- pastel de luna:
api://AzureADTokenExchangeChina
- USNat:
api://AzureADTokenExchangeUSNat
- USSec:
api://AzureADTokenExchangeUSSec
Importante
Si agrega accidentalmente información incorrecta en la configuración de emisor, sujeto o audiencia, se crea correctamente la credencial de identidad federada sin errores. El error no se vuelve evidente hasta que se produce un error en el intercambio de tokens.
- Nube pública:
nombre es el identificador único de la credencial de identidad federada. (Obligatorio) Este campo tiene un límite de 3 a 120 caracteres y debe ser compatible con URL. Se admiten caracteres alfanuméricos, guiones o caracteres de subrayado y el primer carácter solo debe ser alfanumérico. Es inmutable una vez creado.
descripción es la descripción proporcionada por el usuario de la credencial de identidad federada (opcional). Microsoft Entra ID no valida ni comprueba la descripción. Este campo tiene un límite de 600 caracteres.
Los caracteres comodín no se admiten en ningún valor de propiedad de credencial de identidad federada.
Obtener el identificador de objeto de la identidad administrada
- Inicie sesión en Azure Portal.
- En el cuadro de búsqueda, escriba Identidades administradas. En Servicios, seleccione Identidades administradas.
- Busque y seleccione la identidad administrada de usuario asignada que creó como parte de los requisitos previos.
- En el panel Información general, copie el valor de ID de objeto (principal). Este valor se usa como el campo sujeto en la configuración de credenciales federadas.
Configuración de una credencial de identidad federada en una aplicación existente
En esta sección, configurará una credencial de identidad federada en una aplicación existente para confiar en una identidad administrada. Use las pestañas siguientes para elegir cómo configurar una credencial de identidad federada en una aplicación existente.
Inicie sesión en el Centro de administración de Microsoft Entra. Compruebe que está en el inquilino donde está registrada la aplicación.
Vaya a Identidad>Aplicaciones>Registros de aplicaciones y, después, seleccione la aplicación en la ventana principal.
En Administrar, seleccione Certificados y secretos.
Seleccione la pestaña Credenciales federadas y seleccione Agregar credenciales.
En la lista desplegable Escenario de credenciales federadas, seleccione Otro emisor y rellene los valores según la table siguiente:
Campo Descripción Ejemplo Emisor La dirección URL del emisor de OAuth 2.0/OIDC de la entidad de Microsoft Entra ID. https://login.microsoftonline.com/{tenantID}/v2.0
Identificador de sujeto GUID de Principal ID
de la identidad administrada.aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Nombre Nombre descriptivo único para la credencial. msi-webapp1 Descripción (opcional) Descripción proporcionada por el usuario de la credencial de identidad federada. Permitir que los procesos UAMI asuman la identidad de la aplicación Audiencia Valor de audiencia que debe aparecer en el token externo. • en la nube pública: api://AzureADTokenExchange
• Fairfax: api://AzureADTokenExchangeUSGov
• Mooncake: api://AzureADTokenExchangeChina
• USNat: api://AzureADTokenExchangeUSNat
• USSec: api://AzureADTokenExchangeUSSec
Actualización del código de la aplicación para solicitar un token de acceso
En los ejemplos de código siguientes de la tabla siguiente se muestran los flujos de credenciales de cliente "servicio a servicio". Sin embargo, las identidades administradas como credenciales se pueden usar en otros flujos de autenticación, como flujos en nombre de (OBO). Los ejemplos son válidos en ambos casos en los que el inquilino de recursos está en el mismo inquilino que el registro de la aplicación y la identidad administrada o un inquilino diferente.
Azure.Identity
En el ejemplo siguiente se muestra cómo conectarse a un contenedor de Azure Storage mediante Azure.Identity
, pero se puede adaptar para acceder a cualquier recurso protegido por Microsoft Entra. Los ejemplos son válidos en ambos casos en los que el inquilino de recursos está en el mismo inquilino que el registro de la aplicación y la identidad administrada o un inquilino diferente.
using Azure.Identity;
using Azure.Storage.Blobs;
internal class Program
{
// This example demonstrates how to access an Azure blob storage account by utilizing the manage identity credential.
static void Main(string[] args)
{
string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
string containerName = "CONTAINER_NAME";
// The application must be granted access on the target resource
string appClientId = "YOUR_APP_CLIENT_ID";
// The tenant where the target resource is created, in this example, the storage account tenant
// If the resource tenant different from the app tenant, your app needs to be
string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
// The managed identity which you configured as a Federated Identity Credential (FIC)
string miClientId = "YOUR_MANAGED_IDENTITY_CLIENT_ID";
// Audience value must be one of the below values depending on the target cloud.
// Public cloud: api://AzureADTokenExchange
// Fairfax: api://AzureADTokenExchangeUSGov
// Mooncake: api://AzureADTokenExchangeChina
// USNat: api://AzureADTokenExchangeUSNat
// USSec: api://AzureADTokenExchangeUSSec
string audience = "api://AzureADTokenExchange";
// 1. Create an assertion with the managed identity access token, so that it can be exchanged an app token
var miCredential = new ManagedIdentityCredential(managedIdentityClientId);
ClientAssertionCredential assertion = new(
tenantId,
appClientId,
async (token) =>
{
// fetch Managed Identity token for the specified audience
var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { $"{audience}/.default" });
var accessToken = await miCredential.GetTokenAsync(tokenRequestContext).ConfigureAwait(false);
return accessToken.Token;
});
// 2. The assertion can be used to obtain an App token (taken care of by the SDK)
var containerClient = new BlobContainerClient(new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"), assertion);
await foreach (BlobItem blob in containerClient.GetBlobsAsync())
{
// TODO: perform operations with the blobs
BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
Console.WriteLine($"Blob name: {blobClent.Name}, uri: {blobClient.Uri}");
}
}
}
Microsoft.Identity.Web
En Microsoft.Identity.Web, una aplicación web o una API web pueden reemplazar el certificado de cliente por una aserción de cliente firmada para la autenticación. En la aplicación, puede actualizar la sección ClientCredentials
de la appsettings.json a la siguiente configuración:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "YOUR_APPLICATION_ID",
"TenantId": "YOUR_TENANT_ID",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity",
"ManagedIdentityClientId": "YOUR_USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID",
"TokenExchangeUrl":"api://AzureADTokenExchange"
}
]
}
}
MSAL (.NET)
En MSAL, puede usar la clase ManagedClientApplication para adquirir un token de identidad administrada. A continuación, este token se puede usar como aserción de cliente al construir una aplicación cliente confidencial.
Advertencia
En el caso de las aplicaciones .NET, se recomienda encarecidamente usar bibliotecas de nivel superior basadas en MSAL, como Microsoft.Identity.Web o Azure.Identity.
using Microsoft.Identity.Client;
using Azure.Storage.Blobs;
using Azure.Core;
internal class Program
{
static async Task Main(string[] args)
{
string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
string containerName = "CONTAINER_NAME";
string appClientId = "YOUR_APP_CLIENT_ID";
string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
Uri authorityUri = new($"https://login.microsoftonline.com/{resourceTenantId}");
string miClientId = "YOUR_MI_CLIENT_ID";
string audience = "api://AzureADTokenExchange";
// Get mi token to use as assertion
var miAssertionProvider = async (AssertionRequestOptions _) =>
{
var miApplication = ManagedIdentityApplicationBuilder
.Create(ManagedIdentityId.WithUserAssignedClientId(miClientId))
.Build();
var miResult = await miApplication.AcquireTokenForManagedIdentity(audience)
.ExecuteAsync()
.ConfigureAwait(false);
return miResult.AccessToken;
};
// Create a confidential client application with the assertion.
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(appClientId)
.WithAuthority(authorityUri, false)
.WithClientAssertion(miAssertionProvider)
.WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
.Build();
// Get the federated app token for the storage account
string[] scopes = [$"https://{storageAccountName}.blob.core.windows.net/.default"];
AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync().ConfigureAwait(false);
TokenCredential tokenCredential = new AccessTokenCredential(result.AccessToken);
var client = new BlobContainerClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"),
tokenCredential);
await foreach (BlobItem blob in containerClient.GetBlobsAsync())
{
// TODO: perform operations with the blobs
BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
Console.WriteLine($"Blob name: {blobClient.Name}, URI: {blobClient.Uri}");
}
}
}