Compartir a través de


Configuración de una aplicación para confiar en una identidad administrada

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.

Requisitos previos

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, Desarrollador de aplicaciones, Administrador de aplicaciones en la nube, o 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 se debe proporcionar cierta información importante:

  • issuer, subject son los elementos clave de la información necesaria para configurar la relación de confianza. Cuando la carga de trabajo de Azure solicita a la plataforma de identidad de Microsoft que intercambie el token de identidad administrada por un token de acceso de la aplicación Entra, los valores del emisor y del asunto de la credencial de identidad federada se comprueban contra las notificaciones issuer y subject 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.

  • issuer 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. Tanto la aplicación Microsoft Entra como la identidad administrada deben pertenecer al mismo inquilino. Si la reclamación issuer tiene espacios en blanco iniciales o finales en el valor, se bloquea el intercambio de tokens.

  • subject: Este es el GUID sensible a mayúsculas y minúsculas del ID de objeto (entidad de seguridad) de la identidad administrada asignada a la carga de trabajo de Azure. La identidad administrada debe estar en el mismo inquilino que el registro de la aplicación, incluso si el recurso de destino está en una nube diferente. La plataforma de identidad de Microsoft rechazará el intercambio de tokens si la configuración de credenciales de identidad federada subject no coincide exactamente con el Principal ID de la identidad administrada.

    Importante

    Solo las identidades administradas asignadas por el usuario se pueden usar como credenciales federadas para las aplicaciones. No se admiten identidades asignadas por el sistema.

  • audiencies especifica el valor que aparece en la declaración aud en el token de identidad administrada (obligatorio). El valor debe ser uno de los siguientes en función de la nube de destino.

    • Microsoft Entra China (servicio global): api://AzureADTokenExchange
    • Microsoft Entra ID para el Gobierno de EE.UU.: api://AzureADTokenExchangeUSGov
    • Microsoft Entra China operado por 21Vianet: api://AzureADTokenExchangeChina

    Importante

    Se admite el acceso a los recursos de otro inquilino. No se admite el acceso a recursos en otra nube . Se producirá un error en las solicitudes de token a otras nubes.

    Importante

    Si agrega accidentalmente la información en la configuración del issuer, subject o audience, la credencial de identidad federada se crea correctamente sin errores. El error no se vuelve evidente hasta que se produce un error en el intercambio de tokens.

  • nombre es el identificador único para 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.

Configuración de una credencial de identidad federada en una aplicación

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.

  1. Inicie sesión en el Centro de administración de Microsoft Entra. Compruebe que está en el inquilino donde está registrada la aplicación.

  2. Vaya a Entra ID>Registros de aplicaciones y seleccione su aplicación en la ventana principal.

  3. En Administrar, seleccione Certificados y secretos.

  4. Seleccione la pestaña Credenciales federadas y seleccione Agregar credenciales.

    Captura de pantalla del panel certificados y secretos del Centro de administración de Microsoft Entra con la pestaña credenciales federadas resaltada.

  5. En la lista desplegable Escenario de credenciales federadas , seleccione Identidad administrada y rellene los valores según la tabla siguiente:

    Campo Descripción Ejemplo
    Emisor La URL del emisor de OAuth 2.0 / OIDC, de la autoridad de Microsoft Entra ID que emite el token de identidad administrada. Este valor se rellena automáticamente con el emisor actual del inquilino de Entra. https://login.microsoftonline.com/{tenantID}/v2.0
    Selección de la identidad administrada Haga clic en este vínculo para seleccionar la identidad administrada que actuará como credencial de identidad federada. Solo puede usar User-Assigned Identidades Administradas como credencial. msi-webapp1
    Descripción (opcional) Descripción proporcionada por el usuario de la credencial de identidad federada. Confiar en las cargas de trabajo UAMI como una credencial para mi aplicación
    Público Valor de audiencia que debe aparecer en el token externo. Debe establecerse en uno de los siguientes valores:
    Servicio Global de Entra ID: api://AzureADTokenExchange
    ID de Entra para el Gobierno deEE. UU.: api://AzureADTokenExchangeUSGov
    Entra ID China operado por 21Vianet: api://AzureADTokenExchangeChina

    Captura de pantalla de la ventana de credenciales en el Centro de administración de Microsoft Entra.

Actualización del código de la aplicación para solicitar un token de acceso

Los fragmentos de código siguientes muestran cómo adquirir un token de identidad administrada y usarlo como credencial para la aplicación Entra. Los ejemplos son válidos en ambos casos donde el recurso de destino está en el mismo inquilino que la aplicación Entra, o en un inquilino diferente.

Bibliotecas cliente de Azure Identity

Los ejemplos de código siguientes muestran el acceso a un secreto de Azure Key Vault, pero se pueden adaptar para acceder a cualquier recurso protegido por Microsoft Entra.

using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

// Audience value must be one of the below values depending on the target cloud:
// - Entra ID Global cloud: api://AzureADTokenExchange
// - Entra ID US Government: api://AzureADTokenExchangeUSGov
// - Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
string miAudience = "api://AzureADTokenExchange";

// Create an assertion with the managed identity access token, so that it can be
// exchanged for an app token. Client ID is passed here. Alternatively, either
// object ID or resource ID can be passed.
ManagedIdentityCredential miCredential = new(
    ManagedIdentityId.FromUserAssignedClientId("<YOUR_MI_CLIENT_ID>"));
TokenRequestContext tokenRequestContext = new([$"{miAudience}/.default"]);
ClientAssertionCredential clientAssertionCredential = new(
    "<YOUR_RESOURCE_TENANT_ID>",
    "<YOUR_APP_CLIENT_ID>",
    async _ =>
        (await miCredential
            .GetTokenAsync(tokenRequestContext)
            .ConfigureAwait(false)).Token
);

// Create a new SecretClient using the assertion
SecretClient client = new(
    new Uri("https://testfickv.vault.azure.net/"), 
    clientAssertionCredential);

// Retrieve the secret
KeyVaultSecret secret = client.GetSecret("<SECRET_NAME>");

Microsoft.Identity.Web

En Microsoft.Identity.Web, puede establecer la sección ClientCredentials en su appsettings.json para usar SignedAssertionFromManagedIdentity y habilitar su código que utiliza la identidad administrada configurada como credencial.

{
  "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/.default"
      }
    ]
  }
}

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.

using Microsoft.Identity.Client;
using Microsoft.Identity.Client.AppConfig;
using Azure.Storage.Blobs;
using Azure.Core;
using Azure.Storage.Blobs.Models;

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/.default";

      // 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 containerClient = 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}");
        }
    }
}

Consulte también