Compartir a través de


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

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 y subject 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 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.

  • 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ón issuer 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.

  • 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

  1. Inicie sesión en Azure Portal.
  2. En el cuadro de búsqueda, escriba Identidades administradas. En Servicios, seleccione Identidades administradas.
  3. Busque y seleccione la identidad administrada de usuario asignada que creó como parte de los requisitos previos.
  4. 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.

Captura de pantalla de una identidad administrada asignada por el usuario en Azure Portal. El id. de objeto está resaltado, que se usará como campo *asunto* 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.

  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 Identidad>Aplicaciones>Registros de aplicaciones y, después, seleccione la 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 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

    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

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

Consulte también