Tutorial: Conexión de una aplicación de App Service a SQL Database en nombre del usuario que ha iniciado sesión

En este tutorial se muestra cómo habilitar la autenticación integrada en una aplicación de App Service mediante el proveedor de autenticación de Microsoft Entra y, luego, extenderla conectándola a una instancia de Azure SQL Database de back-end mediante la suplantación del usuario que ha iniciado sesión (lo que también se conoce como flujo con derechos delegados). Este es un enfoque de conectividad más avanzado para Tutorial: Acceso a los datos con una identidad administrada y tiene las siguientes ventajas en escenarios empresariales:

  • Elimina los secretos de conexión a los servicios back-end, al igual que el enfoque de identidad administrada.
  • Proporciona a la base de datos de back-end (o a cualquier otro servicio de Azure) más control sobre quién accede o cuánto acceso se concede a sus datos y funcionalidades.
  • Permite que la aplicación adapte su presentación de datos al usuario que ha iniciado sesión.

En este tutorial, agregará la autenticación de Microsoft Entra a la aplicación web de muestra que implementó en uno de los siguientes tutoriales:

Cuando haya terminado, la aplicación de muestra autenticará a los usuarios para que se conecten a SQL Database de forma segura en nombre del usuario que ha iniciado sesión.

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 versiones posteriores

Lo qué aprenderá:

  • Habilitación de la autenticación integrada para Azure SQL Database
  • Deshabilitación de otras opciones de autenticación en Azure SQL Database
  • Habilitación de la autenticación de App Service
  • Uso de Microsoft Entra ID como proveedor de identidades
  • Acceso a Azure SQL Database en nombre del usuario de Microsoft Entra que ha iniciado sesión

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.

Prepare el entorno para la CLI de Azure.

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.

Para iniciar Azure Cloud Shell:

Opción Ejemplo o vínculo
Seleccione Pruébelo en la esquina superior derecha de un bloque de código o de comandos. Solo con seleccionar Pruébelo no se copia automáticamente el código o comando en Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador. Button to launch Azure Cloud Shell.
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal. Screenshot that shows the Cloud Shell button in the Azure portal

Para usar Azure Cloud Shell:

  1. Inicie Cloud Shell.

  2. Seleccione el botón Copiar en un bloque de código (o bloque de comandos) para copiar el código o comando.

  3. Pegue el código o comando en la sesión de Cloud Shell. Para ello, seleccione Ctrl+Mayús+V en Windows y Linux, o bien seleccione Cmd+Mayús+V en macOS.

  4. Seleccione Intro para ejecutar el código o comando.

1. Configuración del servidor de bases de datos con la autenticación de Microsoft Entra

Primero, habilite la autenticación de Microsoft Entra para SQL Database mediante la asignación de un usuario de 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 <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    
  4. Restrinja la autenticación del servidor de bases de datos a la autenticación de Active Directory. Este paso deshabilita eficazmente la autenticación de SQL.

    az sql server ad-only-auth enable --resource-group <group-name> --server-name <server-name>
    

Para más información sobre cómo agregar un administrador de Active Directory, consulte Aprovisionamiento del administrador de Microsoft Entra (SQL Database).

2. Habilitación de la autenticación de usuario para la aplicación

Habilitará la autenticación con Microsoft Entra ID como proveedor de identidades. Para más información, consulte Configuración de la autenticación de Microsoft Entra para la aplicación de App Services.

  1. En el menú de Azure Portal, seleccione Grupos de recursos o busque y seleccione Grupos de recursos desde cualquier página.

  2. En Grupos de recursos, busque y seleccione el grupo de recursos y, a continuación, seleccione la aplicación.

  3. En el menú de la izquierda de la aplicación, seleccione Autenticación y, luego, Agregar proveedor de identidades.

  4. En la página Agregar un proveedor de identidades, seleccione Microsoft en Proveedor de identidades para iniciar sesión en las identidades de Microsoft y Microsoft Entra.

  5. Acepte la configuración predeterminada y seleccione Agregar.

    Screenshot showing the add identity provider page.

Sugerencia

Si se producen errores y vuelve a configurar la autenticación de la aplicación, es posible que no se regeneren los tokens del almacén de tokens con esta nueva configuración. Para asegurarse de que se regeneran, debe cerrar sesión en la aplicación e iniciarla de nuevo. Una manera sencilla de hacerlo es usar el explorador en modo privado y cerrarlo y abrirlo de nuevo en este modo después de cambiar la configuración en las aplicaciones.

3. Configuración de la suplantación de usuario para SQL Database

Actualmente, la aplicación de Azure se conecta a SQL Database y usa la autenticación de SQL (nombre de usuario y contraseña) administrada como configuración de la aplicación. En este paso, concederá permisos de aplicación para acceder a SQL Database en nombre del usuario de Microsoft Entra que ha iniciado sesión.

  1. En la página Autenticación de la aplicación, seleccione el nombre de la aplicación en Proveedor de identidades. Este registro de aplicación se generó automáticamente. Seleccione Permisos de API en el menú izquierdo.

  2. Seleccione Agregar un permiso y, a continuación, API usadas en mi organización .

  3. Escriba Azure SQL Database en el cuadro de búsqueda y seleccione el resultado.

  4. En la página Solicitud de permisos de API de Azure SQL Database, seleccione Permisos delegados y user_impersonation y, después, seleccione Agregar permisos.

    Screenshot of the Request API permissions page showing Delegated permissions, user_impersonation, and the Add permission button selected.

4. Configuración de App Service para devolver un token de acceso que se pueda usar

El registro de la aplicación en Microsoft Entra ID ahora tiene los permisos necesarios para conectarse a SQL Database suplantando al usuario que ha iniciado sesión. A continuación, configure la aplicación de App Service para proporcionar un token de acceso utilizable.

En Cloud Shell, ejecute los siguientes comandos en la aplicación para agregar el parámetro scope a la configuración de autenticación identityProviders.azureActiveDirectory.login.loginParameters.

authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"

Los comandos agregan eficazmente una propiedad loginParameters con ámbitos personalizados adicionales. A continuación, se proporciona una explicación de los ámbitos solicitados:

  • App Service ya solicita openid, profile y email de manera predeterminada. Para obtener información, consulte Ámbitos de OpenID Connect.
  • https://database.windows.net/user_impersonation hace referencia a Azure SQL Database. Es el ámbito que proporciona un token JWT que incluye SQL Database como una audiencia del token.
  • offline_access se incluye aquí por comodidad (en caso de que quiera actualizar los tokens).

Sugerencia

Para configurar los ámbitos necesarios mediante una interfaz web en su lugar, consulte los pasos de Microsoft en Actualización de tokens de autenticación.

Ahora las aplicaciones están configuradas. La aplicación ahora puede generar un token que SQL Database acepte.

5. Uso del token de acceso en el código de la aplicación

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

  1. En Visual Studio, abra la consola del administrador de paquetes y actualice Entity Framework:

    Update-Package EntityFramework
    
  2. En el objeto DbContext (en Models/MyDbContext.cs), agregue el código siguiente al constructor predeterminado.

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    conn.AccessToken = System.Web.HttpContext.Current.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    

Nota:

El código agrega el token de acceso proporcionado por la autenticación de App Service al objeto de conexión.

Este cambio de código no funciona localmente. Para obtener más información, consulte ¿Cómo depurar localmente al usar la autenticación de App Service?

6. Publicación de los cambios

  1. Si vino de Tutorial: Creación de una aplicación ASP.NET en Azure con SQL Database, establezca una cadena de conexión en App Service mediante la autenticación de SQL, con un nombre de usuario y una contraseña. Use el siguiente comando para quitar los secretos de conexión, pero reemplace <group-name>, <app-name>, <db-server-name> y <db-name> con sus datos.

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings MyDbConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    
  2. 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.

    Screenshot showing how to publish from the Solution Explorer in Visual Studio.

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

Cuando la nueva página web muestre la lista de tareas pendientes, la aplicación se conectará a la base de datos en nombre del usuario de Microsoft Entra que haya iniciado sesión.

Azure app after Code First Migration

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

7. 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 <group-name>

Este comando puede tardar varios segundos en ejecutarse.

Preguntas más frecuentes

¿Por qué obtengo un error Login failed for user '<token-identified principal>'.?

Las razones más comunes para que se produzca este error son las siguientes:

¿Cómo agregar otros usuarios o grupos de Microsoft Entra en Azure SQL Database?

  1. Conéctese al servidor de bases de datos; por ejemplo, con sqlcmd o SSMS.

  2. Consulte Creación de usuarios independientes asignados a identidades de Microsoft Entra en la documentación de SQL Database.

    En el siguiente ejemplo de Transact-SQL se agrega una identidad de Microsoft Entra a SQL Server y se le otorgan algunos roles de base de datos:

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

¿Cómo depurar localmente al usar la autenticación de App Service?

Dado que la autenticación de App Service es una característica de Azure, el mismo código no puede funcionar en el entorno local. A diferencia de la aplicación que se ejecuta en Azure, el código local no se beneficia del middleware de autenticación de App Service. Tiene algunas alternativas:

  • Conéctese a SQL Database desde el entorno local con Active Directory Interactive. El flujo de autenticación no inicia la sesión del usuario en la aplicación, pero se conecta a la base de datos de back-end con el usuario que ha iniciado sesión y permite probar la autorización de la base de datos localmente.
  • Copie manualmente el token de acceso desde https://<app-name>.azurewebsites.net/.auth/me en el código, en lugar del encabezado de solicitud X-MS-TOKEN-AAD-ACCESS-TOKEN.
  • Si implementa desde Visual Studio, use la depuración remota de la aplicación de App Service.

¿Qué ocurre cuando expiran los tokens de acceso?

El token de acceso expira después de un tiempo. Para obtener información sobre cómo actualizar los tokens de acceso sin requerir que los usuarios vuelvan a autenticarse con la aplicación, consulte Refresh identity provider tokens (Actualización de tokens del proveedor de identidades).

Pasos siguientes

¿Qué ha aprendido?

  • Habilitación de la autenticación integrada para Azure SQL Database
  • Deshabilitación de otras opciones de autenticación en Azure SQL Database
  • Habilitación de la autenticación de App Service
  • Uso de Microsoft Entra ID como proveedor de identidades
  • Acceso a Azure SQL Database en nombre del usuario de Microsoft Entra que ha iniciado sesión