Tutorial: Protección de la conexión con Azure SQL Database desde App Service 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, 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.

Nota

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

  • .NET Framework 4.7.2 y versiones posteriores.
  • .NET Core 2.2 y versiones posteriores.

Lo qué aprenderá:

  • Habilitar identidades administradas
  • Conceder a SQL Database acceso a la identidad administrada
  • Configurar Entity Framework para utilizar la autenticación de Azure AD con SQL Database
  • Conectarse a SQL Database desde Visual Studio mediante la autenticación de Azure AD

Nota

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

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

Requisitos previos

Este artículo continúa donde lo dejó en Tutorial: Creación de una aplicación ASP.NET en Azure con SQL Database o 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.

    Iniciar Cloud Shell en una nueva ventana

  • Si lo prefiere, instale la CLI de Azure para ejecutar sus comandos de referencia.

    • 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.

    • Cuando 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.

Concesión del acceso a la base de datos a un usuario de Azure AD

Primero debe habilitar la autenticación de Azure AD para SQL Database mediante la asignación de un usuario de Azure AD como administrador de Active Directory para el 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 Azure AD. Para más información sobre los usuarios de Azure AD permitidos, consulte las características de Azure AD y las limitaciones de en SQL Database.

Si el inquilino de Azure AD aún no tiene un usuario, cree uno siguiendo los pasos que se indican en Incorporación o eliminación de usuarios mediante Azure Active Directory.

Busque el identificador de objeto del usuario de Azure AD 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 [].objectId --output tsv)

Sugerencia

Para ver la lista de todos los nombres principales de usuario de Azure AD, ejecute az ad user list --query [].userPrincipalName.

Agregue este usuario de Azure AD 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 Provision an Azure Active Directory administrator for your Server (Aprovisionamiento de un administrador de Azure Active Directory para el servidor)

Configuración de Visual Studio

Cliente Windows

Visual Studio para Windows está integrado con la autenticación de Azure AD. Para habilitar el desarrollo y la depuración en Visual Studio, agregue el usuario de Azure AD en Visual Studio; para ello, seleccione Archivo > Configuración de la cuenta en el menú y haga clic en Agregar un cuenta.

Para establecer el usuario de Azure AD para la autenticación de servicio de Azure, seleccione Herramientas > Opciones en el menú y, después, Azure Service Authentication (Autenticación del servicio de Azure) > Selección de cuentas. Seleccione el usuario de Azure AD que agregó y haga clic en Aceptar.

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

Cliente de macOS

Visual Studio para Mac no está integrado con la autenticación de Azure AD. No obstante, la biblioteca Microsoft.Azure.Services.AppAuthentication que utilizará más adelante puede usar tokens de la CLI de Azure. Para habilitar el desarrollo y la depuración en Visual Studio, primero debe instalar la CLI de Azure en la máquina local.

Una vez que se haya instalado la CLI de Azure en la máquina local, inicie sesión en la CLI de Azure con el siguiente comando mediante el usuario de Azure AD:

az login --allow-no-subscriptions

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

Modificación del proyecto

Los pasos que se siguen para el proyecto dependen de si se trata de un proyecto de ASP.NET o de ASP.NET Core.

Modificación de ASP.NET

En Visual Studio, abra la consola del administrador de paquetes y agregue el paquete NuGet Microsoft.Azure.Services.AppAuthentication:

Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.4.0

En Web.config, desde el principio del archivo, realice los siguientes cambios:

  • En <configSections>, agregue la siguiente declaración de la sección:

    <section name="SqlAuthenticationProviders" type="System.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    
  • Bajo la etiqueta de cierre </configSections>, agregue el siguiente código XML para <SqlAuthenticationProviders>.

    <SqlAuthenticationProviders>
      <providers>
        <add name="Active Directory Interactive" type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
      </providers>
    </SqlAuthenticationProviders>
    
  • Busque la cadena de conexión denominada MyDbConnection y reemplace su valor connectionString por "server=tcp:<server-name>.database.windows.net;database=<db-name>;UID=AnyString;Authentication=Active Directory Interactive". Reemplace <server-name> y <db-name> por el nombre del servidor y el de la base de datos.

Nota

La clase SqlAuthenticationProvider que acaba de registrar se basa en la biblioteca AppAuthentication que ha instalado antes. De forma predeterminada usa una identidad asignada por el sistema. Para aprovechar una identidad asignada por el usuario, necesitará proporcionar una configuración adicional. Consulte Compatibilidad de la cadena de conexión para más información acerca de la biblioteca AppAuthentication.

Eso es todo lo que necesita para conectarse a SQL Database. Al depurar en Visual Studio, el código utiliza el usuario de Azure AD que configuró en Configuración de Visual Studio. Después, configurará SQL Database para permitir la conexión desde la identidad administrada de la aplicación App Service.

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 Azure AD. Esta configuración permite ejecutar migraciones de base de datos desde Visual Studio.

Modificación de ASP.NET Core

En Visual Studio, abra la consola del administrador de paquetes y agregue el paquete NuGet Microsoft.Azure.Services.AppAuthentication:

Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.4.0

En el tutorial de ASP.NET Core y SQL Database, la cadena de conexión MyDbConnection no se usa porque el entorno de desarrollo local utiliza un archivo de base de datos de SQLite y el entorno de producción de Azure usa una cadena de conexión de App Service. Con la autenticación de Active Directory, es conveniente que ambos entornos usen la misma cadena de conexión. En appsettings.json, reemplace el valor de la cadena de conexión MyDbConnection por:

"Server=tcp:<server-name>.database.windows.net,1433;Database=<database-name>;"

A continuación, proporcione el contexto de base de datos de Entity Framework con el token de acceso para la base de datos SQL Database. En Data\MyDatabaseContext.cs, agregue el código siguiente dentro de las llaves del constructor MyDatabaseContext (DbContextOptions<MyDatabaseContext> options) vacío:

var connection = (SqlConnection)Database.GetDbConnection();
connection.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;

Nota

Este código de demostración es sincrónico para mayor claridad y simplicidad.

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

Sugerencia

Si el usuario de Azure AD que ha configurado tiene acceso a varios inquilinos, llame a GetAccessTokenAsync("https://database.windows.net/", tenantid) con el identificador de inquilino que desee para recuperar el token de acceso adecuado.

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 Azure AD. Esta configuración permite ejecutar migraciones de base de datos desde Visual Studio.

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>

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 Azure AD y, a continuación, conceder acceso a SQL Database al grupo de Azure AD 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, <aad-user-name> y <aad-password> por las credenciales del usuario de Azure AD.

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 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 Azure AD. Si la identidad la ha asignado el sistema, el nombre siempre coincide con el nombre de la aplicación de App Service. Para conceder permisos para un grupo de Azure AD, utilice 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

AAD no se admite para SQL Server local y esto incluye las MSI.

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

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.

Publicar desde el Explorador de soluciones

En la página de publicación, haga clic en 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.

Si venía del Tutorial: Cree una aplicación ASP.NET Core y SQL Database en Azure App Service y publique los cambios con Git, con los siguientes comandos:

git commit -am "configure managed identity"
git push azure main

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.

Aplicación de Azure después de Migraciones de Code First

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
  • Configurar Entity Framework para utilizar la autenticación de Azure AD con SQL Database
  • Conectarse a SQL Database desde Visual Studio mediante la autenticación de Azure AD

Vaya al siguiente tutorial para aprender a asignar un nombre DNS personalizado a una aplicación web.