Compartir a través de


Autenticación de aplicaciones de C++ hospedadas en Azure en recursos de Azure mediante una identidad administrada asignada por el usuario

El enfoque recomendado para autenticar una aplicación hospedada en Azure en otros recursos de Azure es usar una identidad administrada . Este enfoque es compatible con la mayoría de los servicios de Azure, incluidas las aplicaciones hospedadas en Azure App Service, Azure Container Apps y Azure Virtual Machines. Obtenga más información sobre las distintas técnicas y enfoques de autenticación en la página de información general de autenticación . En las secciones siguientes, aprenderá lo siguiente:

  • Conceptos esenciales de identidad administrada
  • Creación de una identidad administrada asignada por el usuario para la aplicación
  • Asignación de roles a la identidad administrada asignada por el usuario
  • Cómo autenticar utilizando la identidad administrada asignada al usuario desde el código de tu aplicación

Conceptos esenciales de identidad administrada

Una identidad administrada permite a la aplicación conectarse de forma segura a otros recursos de Azure sin el uso de claves secretas u otros secretos de aplicación. Internamente, Azure realiza un seguimiento de la identidad y a qué recursos puede conectarse. Azure usa esta información para obtener automáticamente tokens de Microsoft Entra para la aplicación para permitir que se conecte a otros recursos de Azure.

Hay dos tipos de identidades administradas que se deben tener en cuenta al configurar la aplicación hospedada:

  • Las identidades administradas por el sistema se habilitan directamente en un recurso de Azure y están atadas a su ciclo de vida. Cuando se elimina el recurso, Azure elimina automáticamente la identidad por usted. Las identidades asignadas por el sistema proporcionan un enfoque minimalista para usar identidades administradas.
  • Las identidades administradas asignadas al usuario se crean como recursos independientes de Azure y ofrecen mayor flexibilidad y capacidades. Son ideales para soluciones que implican varios recursos de Azure que necesitan compartir la misma identidad y permisos. Por ejemplo, si varias máquinas virtuales necesitan acceder al mismo conjunto de recursos de Azure, una identidad administrada asignada por el usuario proporciona reutilización y administración optimizada.

Sugerencia

Obtenga más información sobre cómo seleccionar y administrar identidades administradas asignadas por el sistema y asignadas por el usuario en el artículo recomendaciones de procedimientos recomendados de identidad administrada .

En las secciones siguientes se describen los pasos para habilitar y usar una identidad administrada asignada por el usuario para una aplicación hospedada en Azure. Si necesita usar una identidad administrada asignada por el sistema, visite el artículo identidades administradas asignadas por el sistema para obtener más información.

Creación de una identidad administrada asignada por el usuario

Las identidades administradas asignadas por el usuario se crean como recursos independientes en la suscripción de Azure mediante Azure Portal o la CLI de Azure. Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo con la CLI de Azure instalada.

  1. En Azure Portal, escriba Identidades administradas en la barra de búsqueda principal y seleccione el resultado coincidente en la sección Servicios .

  2. En la página Identidades administradas, selecciona + Crear.

    Captura de pantalla que muestra la página para administrar identidades administradas asignadas por el usuario.

  3. En la página Crear identidad administrada asignada por el usuario , seleccione una suscripción, un grupo de recursos y una región para la identidad administrada asignada por el usuario y proporcione un nombre.

  4. Seleccione Revisar y crear para revisar y validar las entradas.

    Captura de pantalla que muestra el formulario para crear una identidad administrada asignada por el usuario.

  5. Seleccione Crear para crear la identidad administrada asignada por el usuario.

  6. Una vez creada la identidad, seleccione Ir al recurso.

  7. En la página Información general de la nueva identidad, copie el valor de Id. de cliente que se usará más adelante al configurar el código de la aplicación.

Asigna la identidad administrada a tu aplicación

Una identidad administrada asignada por el usuario se puede asociar a uno o varios recursos de Azure. Todos los recursos que usan esa identidad obtienen los permisos aplicados a través de los roles de la identidad.

  1. En Azure Portal, vaya al recurso que hospeda el código de la aplicación, como una instancia de Azure App Service o azure Container App.

  2. En la página de Información general del recurso, expanda Configuración y seleccione Identidad en el panel de navegación.

  3. En la página Identidad, cambie a la pestaña Usuario asignado.

  4. Seleccione + Agregar para abrir el panel Agregar identidad administrada asignada por el usuario .

  5. En el panel Agregar identidad administrada asignada por el usuario , use la lista desplegable Suscripción para filtrar los resultados de búsqueda de sus identidades. Use el cuadro de búsqueda Identidades administradas asignadas por el usuario para buscar la identidad administrada asignada por el usuario que ha habilitado para el recurso de Azure que hospeda la aplicación.

  6. Seleccione la identidad y elija Agregar en la parte inferior del panel para continuar.

    Captura de pantalla que muestra cómo asociar una identidad administrada asignada por el usuario a una aplicación.

Asignación de roles a la identidad administrada

A continuación, determine qué roles necesita la aplicación y asígnelos a la identidad administrada. Puede asignar roles a una identidad administrada en los ámbitos siguientes:

  • Recurso: los roles asignados solo se aplican a ese recurso específico.
  • grupo de recursos: los roles asignados se aplican a todos los recursos contenidos en el grupo de recursos.
  • Suscripción: Los roles asignados se aplican a todos los recursos contenidos en la suscripción.

En el ejemplo siguiente se muestra cómo asignar roles en el ámbito del grupo de recursos, ya que muchas aplicaciones administran todos sus recursos de Azure relacionados mediante un único grupo de recursos.

  1. Vaya a la página Información general del grupo de recursos que contiene la aplicación con la identidad administrada asignada por el usuario.

  2. En el panel de navegación izquierdo, seleccione Control de acceso (IAM) .

  3. En la página Control de acceso (IAM), seleccione + Agregar en el menú superior y, a continuación, elija Agregar asignación de rol para ir a la página Agregar asignación de rol.

    Captura de pantalla que muestra cómo acceder a la página de asignación de roles de identidad.

  4. La página Agregar asignación de roles presenta un flujo de trabajo con pestañas y varios pasos para asignar roles a identidades. En la pestaña de rol inicial, use el cuadro de búsqueda de la parte superior para localizar el rol que desea asignar a la identidad.

  5. Seleccione el rol en los resultados y, a continuación, elija Siguiente para ir a la pestaña Miembros.

  6. En la opción Asignar acceso a, seleccione Identidad administrada.

  7. Para la opción Miembros , elija + Seleccionar miembros para abrir el panel Seleccionar identidades administradas.

  8. En el panel Seleccionar identidades administradas, utilice las listas desplegables de Suscripción e Identidad administrada para filtrar los resultados de búsqueda de sus identidades. Use el cuadro de búsqueda Seleccionar para buscar la identidad administrada que el usuario asignó y habilitó para el recurso de Azure que aloja tu aplicación.

    Captura de pantalla que muestra el proceso de asignación de identidad administrada.

  9. Seleccione la identidad y elija Seleccione en la parte inferior del panel para continuar.

  10. Seleccione en la parte inferior de la página Revisar y asigne.

  11. En la pestaña final Revisar y asignar, seleccione Revisar y asignar para completar el flujo de trabajo.

Autenticación en servicios de Azure desde la aplicación

La biblioteca de identidades de Azure proporciona varias credenciales: implementaciones de TokenCredential adaptadas para admitir diferentes escenarios y flujos de autenticación de Microsoft Entra. Dado que la identidad administrada no está disponible cuando se ejecuta localmente, los pasos siguientes muestran qué credencial usar en qué escenario:

  • Entorno de desarrollo local: durante el desarrollo local solamente, use una clase denominada DefaultAzureCredential para una cadena de credenciales preconfigurada y con opiniones. DefaultAzureCredential detecta las credenciales de usuario de las herramientas locales o el IDE, como la CLI de Azure o Visual Studio. También proporciona flexibilidad y comodidad para reintentos, tiempos de espera para respuestas y compatibilidad con varias opciones de autenticación. Visite el artículo Autenticación en servicios de Azure durante el desarrollo local para más información.
  • Aplicaciones hospedadas en Azure: cuando la aplicación se ejecuta en Azure, use ManagedIdentityCredential para detectar de forma segura la identidad administrada configurada para la aplicación. Especificar este tipo exacto de credencial impide que otras credenciales disponibles se recojan inesperadamente.

Implementación del código

  1. Agregue el paquete azure-identity-cpp a la aplicación mediante vcpkg.

    En un terminal de su elección, vaya al directorio del proyecto de aplicación y ejecute el siguiente comando:

    vcpkg add port azure-identity-cpp
    
  2. Agregue lo siguiente en el archivo CMake:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Se accede a los servicios de Azure mediante clientes especializados de las distintas bibliotecas cliente del SDK de Azure. Para cualquier código de C++ que cree una instancia de un cliente de Azure SDK en tu aplicación, debes:

    1. Incluya el azure/identity.hpp encabezado .
    2. Cree una instancia de DefaultAzureCredential.
    3. Pase la instancia de DefaultAzureCredential al constructor de cliente del SDK de Azure.
    4. Establezca la variable de entorno AZURE_CLIENT_ID en el ID de cliente de la identidad administrada asignada por el usuario.
    5. Establezca la variable de AZURE_TOKEN_CREDENTIAL entorno en ManagedIdentityCredential para asegurarse de que DefaultAzureCredential usa la credencial de identidad administrada. Esta práctica hace que la autenticación sea más predecible y fácil de depurar cuando se implementa en Azure. Para obtener más información, consulte Uso de una credencial específica.

    En el siguiente segmento de código se muestra un ejemplo de estos pasos con un cliente de blobs de Azure Storage.

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    #include <cstdlib>
    
    int main() {
        try {
            // Set the AZURE_CLIENT_ID environment variable to your user-assigned managed identity client ID
            // This can be done in your deployment environment or in code (shown below for demonstration)
            // std::putenv("AZURE_CLIENT_ID=your-user-assigned-identity-client-id");
    
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID environment variable
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID and AZURE_TOKEN_CREDENTIAL environment variables
            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // Get a reference to a blob
            std::string blobName = "sample-blob";
            auto blobClient = containerClient.GetBlobClient(blobName);
    
            // TODO: perform some action with the blob client
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
            std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }
    

Como se describe en el artículo Introducción a la autenticación de Azure SDK para C++ , DefaultAzureCredential admite varios métodos de autenticación y determina el método de autenticación que se usa en tiempo de ejecución. La ventaja de este enfoque es que la aplicación puede usar diferentes métodos de autenticación en distintos entornos sin implementar código específico del entorno. Cuando el código anterior se ejecuta en la estación de trabajo durante el desarrollo local, DefaultAzureCredential utiliza un principal de servicio de la aplicación, según lo determinado por la configuración del entorno, o las credenciales de la herramienta de desarrollador para autenticarse con otros recursos de Azure. Por lo tanto, se puede usar el mismo código para autenticar la aplicación en los recursos de Azure durante el desarrollo local y cuando se implementa en Azure.

Importante

DefaultAzureCredential simplifica la autenticación al desarrollar aplicaciones que se implementan en Azure mediante la combinación de credenciales usadas en entornos de hospedaje de Azure y credenciales usadas en el desarrollo local. En producción, es mejor usar un tipo de credencial específico para que la autenticación sea más predecible y fácil de depurar.

Una alternativa a DefaultAzureCredential es usar ManagedIdentityCredential. Los pasos para usar ManagedIdentityCredential son los mismos que para usar el DefaultAzureCredential tipo .

En el siguiente segmento de código se muestra un ejemplo de estos pasos con un cliente de blobs de Azure Storage.

#include <azure/identity.hpp>
#include <azure/storage/blobs.hpp>
#include <iostream>
#include <memory>

int main() {
    try {
        // Create a user-assigned managed identity credential with the client ID
        Azure::Identity::ManagedIdentityCredentialOptions options;
        options.ClientId = "abcd1234-..."; // Replace with your user-assigned managed identity client ID
        auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>(options);
        
        // Create a client for the specified storage account
        std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
        Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
        
        // Get a reference to a container
        std::string containerName = "sample-container";
        auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        
        // Get a reference to a blob
        std::string blobName = "sample-blob";
        auto blobClient = containerClient.GetBlobClient(blobName);
        
        // TODO: perform some action with the blob client
        // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
        
        std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
        
    } catch (const std::exception& ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
        return 1;
    }
    
    return 0;
}