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:
- Tutorial: Compilación de una aplicación ASP.NET en Azure con Azure SQL Database
- Tutorial: Compilación de una aplicación ASP.NET Core y Azure SQL Database en Azure App Service
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.
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:
- Tutorial: Compilación de una aplicación ASP.NET en Azure con SQL Database
- Tutorial: Compilación de una aplicación ASP.NET Core y SQL Database en Azure App Service.
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.
Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido para Bash en Azure Cloud Shell.
Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure. Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un contenedor de Docker.
Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.
En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.
Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
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.
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.
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'
.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
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.
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).
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
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ónMyDbConnection
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 la aplicación se implementa, obtiene un token de la identidad administrada asignada por el sistema de la aplicación. También puede autenticarse con una identidad administrada asignada por el usuario si incluye:
User Id=<client-id-of-user-assigned-managed-identity>;
en la cadena de conexió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.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:
Las instrucciones de esta sección son para una identidad asignada por el sistema. Para usar una identidad asignada por el usuario, consulte Tutorial: Conexión a bases de datos de Azure desde App Service sin secretos mediante una identidad administrada.
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": "aaaaaaaa-bbbb-cccc-1111-222222222222", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "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
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
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).
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.
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.
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.
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