Tutorial: Conexión a bases de datos de Azure desde App Service sin secretos mediante una identidad administrada

App Service proporciona un servicio de hospedaje web muy escalable y con aplicación de revisiones de un modo automático en Azure. También proporciona una identidad administrada para la aplicación, la cual constituye una solución inmediata para proteger el acceso a bases de datos de Azure, entre las que se incluyen:

Nota:

Este tutorial no incluye una guía paraAzure Cosmos DB, que admite la autenticación de Microsoft Entra de forma diferente. Para más información, consulte la documentación de Azure Cosmos DB, como Uso de identidades administradas asignadas por el sistema para acceder a datos de Azure Cosmos DB.

Las identidades administradas de App Service hacen que su aplicación sea más segura mediante la eliminación de los secretos de aplicación como, por ejemplo, las credenciales en las cadenas de conexión. En este tutorial se muestra cómo conectarse a las bases de datos mencionadas anteriormente desde App Service mediante identidades administradas.

Lo qué aprenderá:

  • Configure un usuario de Microsoft Entra como administrador para la base de datos de Azure.
  • Conéctese a la base de datos como usuario de Microsoft Entra.
  • Configuración de una identidad administrada asignada por el sistema o por el usuario para una aplicación de App Service.
  • Concesión del acceso a la base de datos a la identidad administrada.
  • Conexión a la base de datos de Azure desde el código (.NET Framework 4.8, .NET 6, Node.js, Python, Java) mediante una identidad administrada.
  • Conéctese a la base de datos Azure desde su entorno de desarrollo mediante el usuario Microsoft Entra.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

  • Creación de una aplicación en App Service basada en .NET, Node.js, Python o Java.
  • Creación de un servidor de base de datos con Azure SQL Database, Azure Database for MySQL o Azure Database for PostgreSQL.
  • Debe estar familiarizado con el patrón de conectividad estándar (con nombre de usuario y contraseña) y poder conectarse correctamente desde la aplicación App Service a la base de datos que prefiera.

Prepare el entorno para la CLI de Azure.

1. Instalar la extensión sin contraseña del conector de servicio

Instale la extensión sin contraseña del Conector de servicio para la CLI de Azure:

az extension add --name serviceconnector-passwordless --upgrade

2. Creación de una conexión sin contraseña

A continuación, cree una conexión sin contraseña con el conector de servicio.

Sugerencia

Azure Portal puede ayudarle a redactar los comandos siguientes. En Azure Portal, vaya al recurso Azure App Service, seleccione Conector de servicio en el menú de la izquierda y seleccione Crear. Rellene el formulario con todos los parámetros necesarios. Azure genera automáticamente el comando de creación de conexión, que puede copiar para usarlo en la CLI o ejecutarlo en Azure Cloud Shell.

El siguiente comando de la CLI de Azure usa un parámetro --client-type.

  1. Opcionalmente, ejecute az webapp connection create sql -h para obtener los tipos de cliente admitidos.

  2. Elija un tipo de cliente y ejecute el comando correspondiente. Reemplace los marcadores de posición por sus propios valores.

    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

Este comando del conector de servicio completa las siguientes tareas en segundo plano:

  • Habilite la identidad administrada asignada por el sistema o asigne una identidad de usuario para la aplicación <server-name> hospedada por Azure App Service.
  • Establezca el administrador de Microsoft Entra en el usuario que tiene actualmente la sesión iniciada.
  • Agregue un usuario de base de datos para la identidad administrada asignada por el sistema o la identidad administrada asignada por el usuario. Conceda todos los privilegios de la base de datos <database-name> a este usuario. El nombre de usuario se puede encontrar en la cadena de conexión en la salida del comando anterior.
  • Establezca configuraciones denominadas AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING o AZURE_SQL_CONNECTIONSTRING en el recurso de Azure en función del tipo de base de datos.
  • Para App Service, las configuraciones se establecen en la hoja Configuración de la aplicación.

Si encuentra algún problema al crear una conexión, consulte Solución de problemas para obtener ayuda.

3. Modificación del código

  1. Instale las dependencias.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Obtenga la cadena de conexión de Azure SQL Database de la variable de entorno agregada por Service Connector.

    using Microsoft.Data.SqlClient;
    
    // AZURE_SQL_CONNECTIONSTRING should be one of the following:
    // For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
    // For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Para obtener más información, consulte Uso de la autenticación de identidad administrada de Active Directory.

Para obtener más información, consulte Página principal de la programación de cliente en Microsoft SQL Server. Para obtener más ejemplos de código, consulte Creación de una conexión sin contraseña a un servicio de base de datos mediante Service Connector.

4. Configuración del entorno de desarrollo

Este código de ejemplo usa DefaultAzureCredential para obtener un token utilizable para la base de datos de Azure desde Microsoft Entra ID y, a continuación, lo agrega a la conexión de base de datos. Aunque puede personalizar DefaultAzureCredential, ya es muy versátil de manera predeterminada. Obtiene un token del usuario de Microsoft Entra ID que ha iniciado sesión o de una identidad administrada, en función de si lo ejecuta localmente en el entorno de desarrollo o en App Service.

Sin más cambios, el código está listo para ejecutarse en Azure. Sin embargo, para depurar el código localmente, el entorno de desarrollo necesita un usuario de Microsoft Entra que haya iniciado sesión. En este paso, configurará el entorno que prefiera iniciando sesión con el usuario de Microsoft Entra.

  1. Visual Studio para Windows es integrado con la autenticación de Microsoft Entra. Para habilitar el desarrollo y la depuración en Visual Studio, agregue el usuario de Microsoft Entra en Visual Studio; para ello, seleccione Archivo>Configuración de la cuenta en el menú y seleccione Iniciar sesión o Agregar.

  2. Para establecer el usuario de Microsoft Entra para la autenticación de servicio de Azure, seleccione Herramientas>Opciones en el menú y, después, Autenticación del servicio de Azure>Selección de cuentas. Seleccione el usuario de Microsoft Entra que agregó y seleccione Aceptar.

Para más información sobre cómo configurar el entorno de desarrollo para la autenticación de Microsoft Entra, consulte Biblioteca cliente de identidad de Azure para .NET.

Ahora está listo para desarrollar y depurar la aplicación con SQL Database como back-end y mediante la autenticación de Microsoft Entra.

5. Prueba y publicación

  1. Ejecute el código en el entorno de desarrollo. El código usa el usuario de Microsoft Entra que ha iniciado sesión en su entorno para conectarse a la base de datos back-end. El usuario puede acceder a la base de datos porque está configurado como administrador de Microsoft Entra para la base de datos.

  2. Publique el código en Azure mediante el método de publicación preferido. En App Service, el código usa la identidad administrada de la aplicación para conectarse a la base de datos de back-end.

Preguntas más frecuentes

¿Es la identidad administrada compatible con SQL Server?

El identificador y las identidades administradas de Microsoft Entra no se admiten para SQL Server local.

Obtengo el error Login failed for user '<token-identified principal>'.

La identidad administrada para la que está intentando solicitar un token no está autorizada a acceder a la base de datos de Azure.

He realizado cambios en la autenticación de App Service o en el registro de aplicaciones asociado. ¿Por qué todavía recibo el token anterior?

Los servicios de back-end de las identidades administradas también mantienen una caché de token que actualiza el token de un recurso de destino solo cuando expira. Si modifica la configuración después de intentar obtener un token con su aplicación, no obtendrá realmente un token nuevo con permisos actualizados hasta que expire el token de la caché. La mejor manera de solucionar esto es probar los cambios con una nueva ventana InPrivate (Edge), private (Safari), Incógnito (Chrome). De este modo, está seguro de empezar desde una nueva sesión autenticada.

¿Cómo se agrega la identidad administrada a un grupo de Microsoft Entra?

Si lo desea, puede agregar la identidad a un grupo de Microsoft Entra y, a continuación, conceder acceso al grupo Microsoft Entra en lugar de a la identidad. Por ejemplo, los siguientes comandos agregan la identidad administrada del paso anterior a un nuevo grupo llamado myAzureSQLDBAccessGroup:

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

Para conceder permisos de base de datos para un grupo de Microsoft Entra, consulte la documentación del tipo de base de datos correspondiente.

Obtengo el error SSL connection is required. Please specify SSL options and retry.

La conexión a la base de datos de Azure requiere una configuración adicional y está fuera del ámbito de este tutorial. Para más información, consulte uno de los siguientes vínculos:

Configuración de la conectividad TLS en Azure Database for PostgreSQL: servidor únicoConfiguración de la conectividad SSL en la aplicación para conectarse de forma segura a Azure Database for MySQL

Pasos siguientes

¿Qué ha aprendido?

  • Configure un usuario de Microsoft Entra como administrador para la base de datos de Azure.
  • Conéctese a la base de datos como usuario de Microsoft Entra.
  • Configuración de una identidad administrada asignada por el sistema o por el usuario para una aplicación de App Service.
  • Concesión del acceso a la base de datos a la identidad administrada.
  • Conexión a la base de datos de Azure desde el código (.NET Framework 4.8, .NET 6, Node.js, Python, Java) mediante una identidad administrada.
  • Conéctese a la base de datos Azure desde su entorno de desarrollo mediante el usuario Microsoft Entra.