Conexión desde la aplicación a los recursos sin administrar credenciales

Los recursos de Azure con compatibilidad con identidades administradas siempre proporcionan una opción para especificar una identidad administrada con la que conectarse a los recursos de Azure que admiten la autenticación de Microsoft Entra. La compatibilidad con identidades administradas hace que los desarrolladores no necesiten administrar credenciales en el código. Las identidades administradas son la opción de autenticación recomendada cuando se trabaja con recursos de Azure que las admitan. Lea una introducción a identidades administradas.

En esta página se muestra cómo configurar una instancia de App Service para que pueda conectarse a Azure Key Vault, Azure Storage y Microsoft SQL Server. Se pueden usar los mismos principios para cualquier recurso de Azure que admita identidades administradas y que se conecte a los recursos que admitan la autenticación de Microsoft Entra.

Los ejemplos de código usan la biblioteca cliente de Identidad de Azure, que es el método recomendado, ya que administra automáticamente muchos de los pasos, incluida la adquisición de un token de acceso que se utiliza en la conexión.

¿A qué recursos se pueden conectar las identidades administradas?

Una identidad administrada puede conectarse a cualquier recurso que admita la autenticación de Microsoft Entra. En general, no se requiere una compatibilidad especial para que el recurso permita que las identidades administradas se conecten a él.

Algunos recursos no admiten la autenticación de Microsoft Entra o su biblioteca cliente no admite la autenticación con un token. Siga leyendo para ver nuestras instrucciones sobre cómo usar una identidad administrada para acceder de forma segura a las credenciales sin necesidad de almacenarlas en el código o la configuración de la aplicación.

Creación de identidades administradas

Hay dos tipos de identidad administrada: las asignadas por el sistema y las asignadas por el usuario. Las identidades asignadas por el sistema están vinculadas directamente a un único recurso de Azure. Cuando se elimina el recurso de Azure, también se elimina la identidad. Una identidad administrada asignada por el usuario se puede asociar a varios recursos de Azure, y su ciclo de vida es independiente de esos recursos.

En este artículo se explica cómo crear y configurar una identidad administrada asignada por el usuario, recomendada para la mayoría de los escenarios. Si el recurso de origen que utiliza no admite identidades administradas asignadas por el usuario, debe consultar la documentación del proveedor de ese recurso para aprender a configurarlo y que tenga una identidad administrada asignada por el sistema.

Creación de una identidad administrada asignada por el usuario

Nota

Necesitará un rol como "Colaborador de identidad administrada" para crear una nueva identidad administrada asignada por el usuario.

  1. Busque "Identidades administradas" en la barra de búsqueda de la parte superior del Portal y seleccione el resultado coincidente.

Screenshot of searching for managed identities in the portal.

  1. Seleccione el botón "Crear".

Screenshot showing a managed identity create button in the portal.

  1. Seleccione la suscripción y el grupo de recursos y escriba un nombre para la identidad administrada.

Screenshot showing a managed identity create screen in the portal.

  1. Seleccione "Revisar y crear" para ejecutar la prueba de validación y, después, el botón "Crear".

  2. Cuando se haya creado la identidad, aparecerá una pantalla de confirmación.

Screenshot showing a managed identity confirmation screen after creation in the portal.

Ahora tiene una identidad que se puede asociar a un recurso de origen de Azure. Más información sobre la administración de identidades administradas asignadas por el usuario.

Configuración del recurso de origen para usar una identidad administrada asignada por el usuario

Siga estos pasos para configurar el recurso de Azure a fin de tener una identidad administrada mediante el Portal. Consulte la documentación del tipo de recurso específico para aprender a configurar la identidad del recurso mediante la interfaz de la línea de comandos, PowerShell o la plantilla de ARM.

Nota

Necesitará permisos de "escritura" a fin de configurar un recurso de Azure para tener una identidad asignada por el sistema. Necesitará un rol como "Operador de identidad administrada" para asociar una identidad asignada por el usuario a un recurso de Azure.

  1. Busque el recurso mediante la barra de búsqueda de la parte superior del Portal.

Screenshot showing a resource being searched for in the portal.

  1. Seleccione el vínculo Identidad en el panel de navegación.

Screenshot showing the link to the identity screen for a resource in the portal.

  1. Seleccione la pestaña "Asignada por el usuario".

  2. Seleccione el botón "Agregar".

Screenshot showing a user-assigned identity screen in the portal.

  1. Seleccione la identidad asignada por el usuario que creó anteriormente y, luego, "Agregar".

Screenshot showing a user-assigned identity being selected in the portal.

  1. La identidad se asociará al recurso, y la lista se actualizará.

Screenshot showing a user-assigned identity has been associated with the Azure resource in the portal.

El recurso de origen ahora tiene una identidad asignada por el usuario que puede usar para conectarse a los recursos de destino.

Incorporación de permisos a la identidad

Nota

Necesitará un rol como "Administrador de acceso de usuario" o "Propietario" para el recurso de destino a fin de agregar asignaciones de roles. Asegúrese de conceder los privilegios mínimos necesarios para que se ejecute la aplicación.

Ahora App Service tiene una identidad administrada, y deberá conceder a la identidad los permisos correctos. A medida que use esta identidad para interactuar con Azure Storage, utilizará el sistema de control de acceso basado en rol (RBAC) de Azure.

  1. Busque el recurso al que desea conectarse mediante la barra de búsqueda de la parte superior del Portal.
  2. Seleccione el vínculo "Control de acceso (IAM)" en el panel de navegación izquierdo.

Screenshot showing a resource summary screen in the portal.

  1. Seleccione el botón "Agregar" situado cerca de la parte superior de la pantalla y, luego, "Agregar asignación de roles".

Screenshot showing the add role assignment navigation in the portal.

  1. Se mostrará una lista de roles. Para ver los permisos específicos que tiene un rol, seleccione el vínculo "Ver". Seleccione el rol que desea conceder a la identidad y, después, el botón "Siguiente".

Screenshot showing a role being selected in the portal.

  1. Se le pedirá que seleccione a quién se debe conceder el rol. Seleccione la opción "Identidad administrada" y, a continuación, el vínculo "Agregar miembros".

Screenshot showing the identity type being selected in the portal.

  1. Aparecerá un panel de contexto a la derecha donde puede buscar por el tipo de identidad administrada. Seleccione "Identidad administrada por el usuario" en la opción "Identidad administrada".

Screenshot showing managed identity being selected in the portal.

  1. Seleccione la identidad que creó anteriormente y el botón "Seleccionar". Se cerrará el panel de contexto y se agregará la identidad a la lista.

Screenshot showing an identity being added to a resource in the portal.

  1. Seleccione el botón "Revisar y asignar" para ver el resumen de la asignación de roles y, a continuación, una vez más para confirmarlo.
  2. Seleccione la opción "Asignaciones de roles", y se mostrará una lista de las asignaciones de roles para el recurso.

Screenshot showing the role assignment has been added in the portal.

La identidad administrada ahora tiene los permisos correctos para acceder al recurso de destino de Azure. Más información sobre el control de acceso basado en roles de Azure.

Uso de la identidad administrada en el código

App Service tiene ahora una identidad administrada con permisos. Puede usar la identidad administrada en el código para interactuar con los recursos de destino, en lugar de almacenar las credenciales en el código.

El método recomendado es usar la biblioteca de identidades de Azure para el lenguaje de programación preferido. Los lenguajes admitidos incluyen .NET, Java, JavaScript, Python, Go y C++. La biblioteca adquiere tokens de acceso para usted, lo que facilita la conexión a los recursos de destino.

Uso de la biblioteca de identidades de Azure en el entorno de desarrollo

Excepto en la biblioteca de C++, las bibliotecas de identidades de Azure admiten un tipo DefaultAzureCredential. DefaultAzureCredential intenta autenticarse automáticamente mediante varios mecanismos, incluidas las variables de entorno o un inicio de sesión interactivo. El tipo de credencial se puede usar en el entorno de desarrollo con sus propias credenciales. También se puede utilizar en el entorno de producción de Azure mediante una identidad administrada. No se requieren cambios en el código al implementar la aplicación.

Si usa identidades administradas asignadas por el usuario, también debe especificar explícitamente la identidad administrada asignada por el usuario con la que desea autenticarse y pasar el identificador de cliente de la identidad como parámetro. Para recuperar el identificador de cliente, vaya a la identidad en el Portal.

Screenshot showing the client ID for the managed identity in the portal.

Más información sobre las bibliotecas de identidades de Azure a continuación:

Acceso a un blob en Azure Storage

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

Acceso a un secreto almacenado en Azure Key Vault

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

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

Acceso a Azure SQL Database

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

Conexión a recursos que no admiten la autenticación de Microsoft Entra o basada en tokens en las bibliotecas

Algunos recursos de Azure no admiten aún la autenticación de Microsoft Entra o sus bibliotecas cliente no admiten la autenticación con un token. Normalmente, estos recursos son tecnologías de código abierto que esperan un nombre de usuario y una contraseña o una clave de acceso en una cadena de conexión.

Para evitar almacenar las credenciales en el código o la configuración de la aplicación, puede almacenar las credenciales como un secreto en Azure Key Vault. Con el ejemplo mostrado anteriormente, puede recuperar el secreto de Azure Key Vault mediante una identidad administrada y pasar las credenciales a la cadena de conexión. Este enfoque significa que no es necesario administrar las credenciales directamente en el código o el entorno.

Instrucciones en caso de administrar tokens directamente

En algunos escenarios, es posible que quiera adquirir tokens para identidades administradas manualmente en lugar de usar un método integrado para conectarse al recurso de destino. Estos escenarios no incluyen ninguna biblioteca cliente para el lenguaje de programación que está utilizando o el recurso de destino al que se está conectando o al conectarse a recursos que no se ejecutan en Azure. Al adquirir tokens manualmente, se proporcionan las siguientes directrices:

Almacenamiento en caché de los tokens adquiridos

Para mejorar el rendimiento y la confiabilidad, se recomienda que la aplicación almacene en caché los tokens en la memoria local o cifrados si desea guardarlos en el disco. Como los tokens de identidad administrada son válidos durante 24 horas, no hay ninguna ventaja en solicitar nuevos tokens con regularidad, ya que se devolverá uno almacenado en caché desde el punto de conexión de emisión de tokens. Si supera los límites de solicitud, se le limitará la velocidad y recibirá un error HTTP 429.

Al adquirir un token, puede establecer la memoria caché de tokens para que expire 5 minutos antes de expires_on (o propiedad equivalente) que se devolverá cuando se genere el token.

Inspección de tokens

La aplicación no se debe basar en el contenido de un token. El contenido del token está pensado solo para la audiencia (recurso de destino) a la que se accede, no para el cliente que solicita el token. El contenido del token puede cambiar o cifrarse en el futuro.

No exponer ni mover tokens

Los tokens deben tratarse como credenciales. No los exponga a usuarios u otros servicios; por ejemplo, soluciones de registro y supervisión. No se deben mover desde el recurso de origen que los usa, excepto para autenticarse en el recurso de destino.

Pasos siguientes