Tutorial: Conectar para SQL Database de .NET 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 Azure SQL Database y a otros servicios de Azure. 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 agregará una identidad administrada a la aplicación web de ejemplo que se creó en los tutoriales siguientes:

Cuando haya terminado, la aplicación de ejemplo se conectará a SQL Database de forma segura sin necesidad de nombres de usuario ni contraseñas.

Architecture diagram for tutorial scenario.

Nota:

Los pasos descritos en este tutorial son compatibles con las siguientes versiones:

  • .NET Framework 4.8 y versiones posteriores
  • .NET 6.0 y versiones posteriores

Para instrucciones sobre Azure Database for MySQL o Azure Database for PostgreSQL en otros marcos de lenguaje (Node.js, Python y Java), vea Tutorial: Conexión a bases de datos de Azure desde App Service sin secretos mediante una identidad administrada.

Lo qué aprenderá:

  • Habilitar identidades administradas
  • Conceder a SQL Database acceso a la identidad administrada
  • Configuración de Entity Framework para usar la autenticación de Microsoft Entra con SQL Database
  • Conexión a SQL Database desde Visual Studio mediante la autenticación de Microsoft Entra

Nota:

La autenticación de Microsoft Entra es distinta de la Autenticación de Windows integrada en Active Directory (AD DS) local. AD DS y Microsoft Entra ID usan protocolos de autenticación completamente diferentes. Para obtener más información, consulte Documentación de Microsoft Entra Domain Services .

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

Requisitos previos

Este artículo continúa donde lo dejó en uno de los siguientes tutoriales:

Si aún no lo ha hecho, siga uno de los dos tutoriales en primer lugar. Como alternativa, puede adaptar los pasos para su propia aplicación .NET con SQL Database.

Para depurar la aplicación con SQL Database como back-end, asegúrese de permitir la conexión de cliente desde el equipo. Si no es así, agregue la dirección IP del cliente siguiendo los pasos que se describen en Administración de reglas de firewall de nivel de servidor mediante Azure Portal.

Prepare el entorno para la CLI de Azure.

1. Concesión de acceso de base de datos al usuario de Microsoft Entra

En primer lugar, habilite la autenticación Microsoft Entra para SQL Database asignando un usuario Microsoft Entra como administrador del servidor. Este usuario no es la cuenta Microsoft que usó para suscribirse a Azure. Debe ser un usuario que haya creado, importado, sincronizado o invitado en Microsoft Entra ID. Para obtener más información sobre los usuarios permitidos de Microsoft Entra, consulte Características y limitaciones de Microsoft Entra en SQL Database.

  1. Si el inquilino de Microsoft Entra aún no tiene un usuario, cree uno siguiendo los pasos descritos en Agregar o eliminar usuarios mediante Microsoft Entra ID.

  2. Busque el identificador de objeto del usuario de Microsoft Entra mediante az ad user list y reemplace <user-principal-name>. El resultado se guardará en una variable.

    $azureaduser=(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query '[].id' --output tsv)
    

    Sugerencia

    Para ver la lista de todos los nombres principales de usuario en Microsoft Entra ID, ejecute az ad user list --query '[].userPrincipalName'.

  3. Agregue este usuario de Microsoft Entra como administrador de Active Directory mediante el comando az sql server ad-admin create en Cloud Shell. En el siguiente comando, reemplace <server-name> por el nombre del servidor (sin el sufijo .database.windows.net).

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

Para más información sobre cómo agregar un administrador de Active Directory, consulte Aprovisionar un administrador de Microsoft Entra para su servidor

2. Configuración del entorno de desarrollo

  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 Azure AD.

3. Modificación del proyecto

Nota

Ya no se recomienda usar Microsoft.Azure.Services.AppAuthentication con el nuevo SDK de Azure. Se reemplaza por la nueva biblioteca de clientes de identidades de Azure disponible para .NET, Java, TypeScript y Python, y debe usarse para todo el desarrollo nuevo. Aquí puede encontrar información sobre cómo migrar a Azure Identity: Guía de migración de AppAuthentication a Azure.Identity.

Los pasos que siga para el proyecto dependerán de si usa Entity Framework Core (predeterminado para ASP.NET Core) o Entity Framework Core (predeterminado para ASP.NET).

  1. En Visual Studio, abra la consola del administrador de paquetes y agregue el paquete NuGet Microsoft.Data.SqlClient:

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. En el tutorial de ASP.NET Core y SQL Database, la cadena de conexión MyDbConnection de appsettings.json aún no se usa. Tanto el entorno local como el entorno de Azure obtienen cadenas de conexión de sus respectivas variables de entorno para mantener los secretos de conexión fuera del archivo de origen. Pero ahora, con la autenticación de Active Directory ya no hay más secretos. En appsettings.json, reemplace el valor de la cadena de conexión MyDbConnection por:

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    Nota

    El tipo de autenticación predeterminado de Active Directory se puede usar tanto en el equipo local como en Azure App Service. El controlador intenta adquirir un token de Microsoft Entra ID mediante varios medios. Si se implementa la aplicación, obtiene un token de la identidad administrada de la aplicación. Si la aplicación se ejecuta localmente, intenta obtener un token de Visual Studio, Visual Studio Code y la CLI de Azure.

    Eso es todo lo que necesita para conectarse a SQL Database. Al depurar en Visual Studio, el código usa el usuario de Microsoft Entra que configuró en 2. Configuración de un entorno de desarrollo. Después, configurará SQL Database para permitir la conexión desde la identidad administrada de la aplicación App Service. La DefaultAzureCredential clase almacena en caché el token en la memoria y lo recupera de Microsoft Entra ID justo antes de que expire. Para actualizar el token no es necesario ningún código personalizado.

  3. Escriba Ctrl+F5 para ejecutar la aplicación de nuevo. Ahora, la misma aplicación CRUD del explorador se conectará a Azure SQL Database directamente con la autenticación de Microsoft Entra. Esta configuración permite ejecutar migraciones de base de datos desde Visual Studio.

4. Uso de la conectividad de la identidad administrada

A continuación, configure la aplicación de App Service para conectarse a SQL Database con una identidad administrada asignada por el sistema.

Nota

Aunque las instrucciones de esta sección son para una identidad asignada por el sistema, es igual de fácil usar una identidad asignada por el usuario. Para ello necesitaría cambiar az webapp identity assign command para asignar la identidad asignada por el usuario deseada. Luego, al crear el usuario de SQL, asegúrese de usar el nombre del recurso de la identidad asignada por el usuario, en lugar del nombre del sitio.

Habilitación de la identidad administrada en la aplicación

Para habilitar una identidad administrada para la aplicación de Azure, use el comando az webapp identity assign de Cloud Shell. En el siguiente comando, reemplace <app-name>.

az webapp identity assign --resource-group myResourceGroup --name <app-name>

Nota:

Para habilitar la identidad administrada de una ranura de implementación, agregue --slot <slot-name> y use el nombre de la ranura en <slot-name>.

Este es un ejemplo de la salida:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

Concesión de permisos a una identidad administrada

Nota:

Si lo desea, puede agregar la identidad a un grupo de Microsoft Entra y, a continuación, conceder a SQL Database 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 myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. En Cloud Shell, inicie sesión en SQL Database mediante el comando SQLCMD. Reemplace <server-name> por el nombre del servidor, <db-name> por el nombre de la base de datos que usa la aplicación y <aad-user-name> y <aad-password> por las credenciales del usuario de Microsoft Entra.

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. En el símbolo del sistema de SQL para la base de datos que desee, ejecute los siguientes comandos para conceder los permisos mínimos que la aplicación necesita. Por ejemplo,

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

    <identity-name> es el nombre de la identidad administrada en Microsoft Entra ID. Si la identidad la ha asignado el sistema, el nombre siempre coincide con el nombre de la aplicación de App Service. En el caso de una ranura de implementación, el nombre de su identidad asignada por el sistema es <app-name>/slots/<slot-name>. Para conceder permisos para un grupo de Microsoft Entra, use en su lugar el nombre para mostrar del grupo (por ejemplo, myAzureSQLDBAccessGroup).

  3. Escriba EXIT para volver al símbolo del sistema de Cloud Shell.

    Nota

    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 realiza algún error al configurar los permisos de SQL Database e intenta modificarlos 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é.

    Nota:

    No se admiten instancias administradas ni Microsoft Entra ID en el entorno local de SQL Server.

Modificación de la cadena de conexión

Recuerde que los mismos cambios que haya realizado en Web.config o appsettings.json funcionan con la identidad administrada, por lo que lo único necesario es eliminar la cadena de conexión existente de App Service, que Visual Studio creó al implementar la aplicación inicialmente. En los siguientes comandos, reemplace <app-name> por el nombre de la aplicación.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. Publicación de los cambios

Ahora lo único que queda es publicar los cambios en Azure.

  1. Si venía del Tutorial: Creación de una aplicación de ASP.NET en Azure con SQL Database , publique los cambios en Visual Studio. En el Explorador de soluciones, haga clic con el botón derecho en su proyecto DotNetAppSqlDb y seleccione Publicar.

    Publish from Solution Explorer

  2. En la página de publicación, seleccione Publicar.

    Importante

    Asegúrese de que el nombre del servicio de aplicaciones no coincide con ningún registro de aplicaciones existente. De lo contrario, se producirían conflictos de identificadores de entidad de seguridad.

Cuando la página web nueva muestra su lista de tareas pendientes, la aplicación se conecta a la base de datos mediante la identidad administrada.

Azure app after Code First Migration

Ahora ya puede editar la lista de tareas pendientes como antes.

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes

¿Qué ha aprendido?

  • Habilitar identidades administradas
  • Conceder a SQL Database acceso a la identidad administrada
  • Configuración de Entity Framework para usar la autenticación de Microsoft Entra con SQL Database
  • Conexión a SQL Database desde Visual Studio mediante la autenticación de Microsoft Entra