Conexión y consulta de Azure SQL Database mediante .NET y Entity Framework Core

Se aplica a: Azure SQL Database

En esta guía de inicio rápido se describe cómo conectar una aplicación a una base de datos de Azure SQL Database y realizar consultas usando .NET y Entity Framework Core. En este inicio rápido se sigue el enfoque recomendado sin contraseña para conectarse a la base de datos. Puede consultar más información sobre las conexiones sin contraseña en Conexiones sin contraseña para servicios de Azure.

Requisitos previos

Configuración del servidor de bases de datos

Las conexiones seguras sin contraseña a Azure SQL Database requieren una cierta configuración de la base de datos. Compruebe la siguiente configuración en el servidor lógico de Azure para conectarse correctamente a Azure SQL Database tanto en el entorno local como en un entorno hospedado:

  1. En el caso de las conexiones de desarrollo local, asegúrese de que el servidor lógico está configurado para permitir que la dirección IP de la máquina local y otros servicios de Azure se conecten:

    • Vaya a la página Redes del servidor.

    • Active o desactive el botón de radio Redes seleccionadas para mostrar opciones de configuración adicionales.

    • Seleccione Agregar la dirección IPv4 de cliente (xx.xx.xx.xx) para agregar una regla de firewall que habilitará las conexiones desde la dirección IPv4 del equipo local. Como alternativa, también puede seleccionar + Agregar una regla de firewall para especificar una dirección IP específica de su elección.

    • Asegúrese de que la casilla Permitir que los servicios y recursos de Azure accedan a este servidor esté seleccionada.

      Captura de pantalla que muestra cómo configurar reglas de firewall.

      Advertencia

      La habilitación de la opción Permitir que los servicios y recursos de Azure accedan a este servidor no es un procedimiento de seguridad recomendado para escenarios de producción. Las aplicaciones reales deben implementar enfoques más seguros, como restricciones de firewall más fuertes o configuraciones de red virtual.

      Puede consultar más información sobre las configuraciones de seguridad de la base de datos en los siguientes recursos:

  2. El servidor también debe tener habilitada la autenticación de Microsoft Entra y tener asignada una cuenta de administrador de Microsoft Entra. Para las conexiones de desarrollo local, la cuenta de administrador de Microsoft Entra debe ser una cuenta que también puede iniciar sesión en Visual Studio o en la CLI de Azure localmente. Puede comprobar si el servidor tiene habilitada la autenticación de Microsoft Entra en la página de Microsoft Entra ID del servidor lógico.

    Captura de pantalla que muestra cómo habilitar la autenticación de Microsoft Entra.

  3. Si usa una cuenta personal de Azure, asegúrese de que ha instalado y configurado Microsoft Entra para Azure SQL Database con el fin de asignar su cuenta como administrador del servidor. Si usa una cuenta corporativa, es probable que Microsoft Entra ID ya esté configurado.

Creación del proyecto

En los pasos de esta sección se crea una API web mínima de .NET mediante la CLI de .NET o Visual Studio 2022.

  1. En la barra de menús de Visual Studio, vaya a Archivo>nuevo>Proyecto....

  2. En la ventana de diálogo, escriba ASP.NET en el cuadro de búsqueda de la plantilla de proyecto y seleccione el resultado de la API web de ASP.NET Core. Elija Siguiente en la parte inferior del cuadro de diálogo.

  3. En Nombre del proyecto, escriba DotNetSQL. Deje los valores predeterminados para el resto de los campos y seleccione Siguiente.

  4. En Plataforma, seleccione .NET 7.0 y desactive la opción Usar controladores (desactivar para usar API mínimas). En esta guía de inicio rápido se usa una plantilla de API mínima para simplificar la creación y configuración de puntos de conexión.

  5. Seleccione Create. El nuevo proyecto se abre en el entorno de Visual Studio.

Incorporación de Entity Framework Core al proyecto

Para conectarse a Azure SQL Database mediante .NET y Entity Framework Core, debe agregar tres paquetes NuGet al proyecto siguiendo uno de los siguientes métodos:

  1. En la ventana Explorador de soluciones, haga clic con el botón derecho en el nodo Dependencias y seleccione Administrar paquetes NuGet.

  2. En la ventana resultante, busque EntityFrameworkCore. Busque e instale los siguientes paquetes:

  • Microsoft.EntityFrameworkCore: proporciona una funcionalidad esencial de Entity Framework Core.
  • Microsoft.EntityFrameworkCore.SqlServer: proporciona componentes adicionales para conectarse al servidor lógico.
  • Microsoft.EntityFrameworkCore.Design: proporciona compatibilidad para ejecutar migraciones de Entity Framework.

Como alternativa, también puede ejecutar el cmdlet Install-Package en la ventana Consola del Administrador de paquetes:

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Design

Adición del código para conectarse a Azure SQL Database

Las bibliotecas de Entity Framework Core se basan en las bibliotecas Microsoft.Data.SqlClient y Azure.Identity para implementar conexiones sin contraseña a Azure SQL Database. La biblioteca Azure.Identity proporciona una clase denominada DefaultAzureCredential que controla la autenticación sin contraseña en Azure.

DefaultAzureCredential admite varios métodos de autenticación y determina qué método se usa en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos (local frente a producción) sin implementar código específico del entorno. La introducción a la biblioteca de identidades de Azure explica el orden y las ubicaciones en las que DefaultAzureCredential busca las credenciales.

Complete los pasos siguientes para conectarse a Azure SQL Database por medio de Entity Framework Core y la clase DefaultAzureCredential subyacente:

  1. Agregue una sección ConnectionStrings al archivo appsettings.Development.json para que coincida con el siguiente código. Asegúrese de actualizar los marcadores de posición <your database-server-name> y <your-database-name>.

    La cadena de conexión sin contraseña incluye un valor de configuración de Authentication=Active Directory Default, que permite a Entity Framework Core usar DefaultAzureCredential para conectarse a los servicios de Azure. Cuando la aplicación se ejecuta localmente, se autentica con el usuario con el que ha iniciado sesión en Visual Studio. Una vez que la aplicación se implementa en Azure, el mismo código detecta y aplica la identidad administrada asociada a la aplicación hospedada, que configurará más adelante.

    Nota:

    Las cadenas de conexión sin contraseña son seguras para confirmarse en el control de código fuente, ya que no contienen secretos como nombres de usuario, contraseñas o claves de acceso.

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "ConnectionStrings": {
            "AZURE_SQL_CONNECTIONSTRING": "Data Source=passwordlessdbserver.database.windows.net;
                Initial Catalog=passwordlessdb; Authentication=Active Directory Default; Encrypt=True;"
        }
    }
    
  2. Agregue el siguiente código al archivo Program.cs encima de la línea de código var app = builder.Build();. Este código configura lo siguiente:

    • Recupera la cadena de conexión a la base de datos sin contraseña del archivo appsettings.Development.json para el desarrollo local, o bien de las variables de entorno para escenarios de producción hospedados.

    • Registra la clase DbContext de Entity Framework Core en el contenedor de inserción de dependencias de .NET.

      var connection = String.Empty;
      if (builder.Environment.IsDevelopment())
      {
          builder.Configuration.AddEnvironmentVariables().AddJsonFile("appsettings.Development.json");
          connection = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");
      }
      else
      {
          connection = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
      }
      
      builder.Services.AddDbContext<PersonDbContext>(options =>
          options.UseSqlServer(connection));
      
  3. Agregue los siguientes puntos de conexión al final del archivo Program.cs, encima de app.Run(), para recuperar y agregar entidades en la base de datos con la clase PersonDbContext.

    app.MapGet("/Person", (PersonDbContext context) =>
    {
        return context.Person.ToList();
    })
    .WithName("GetPersons")
    .WithOpenApi();
    
    app.MapPost("/Person", (Person person, PersonDbContext context) =>
    {
        context.Add(person);
        context.SaveChanges();
    })
    .WithName("CreatePerson")
    .WithOpenApi();
    

    Por último, agregue las clases Person y PersonDbContext al final del archivo Program.cs. La clase Person representa un único registro en la tabla Persons de la base de datos. La clase PersonDbContext representa la base de datos Person y permite realizar operaciones en ella mediante código. Puede obtener más información sobre DbContext en el artículo Introducción a EF Core, en la documentación de Entity Framework Core.

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
    public class PersonDbContext : DbContext
    {
        public PersonDbContext(DbContextOptions<PersonDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Person> Person { get; set; }
    }
    

Ejecución de las migraciones para crear la base de datos

Para actualizar el esquema de la base de datos con el fin de que coincida con el modelo de datos mediante Entity Framework Core, debe usar una migración. Las migraciones pueden crear y actualizar incrementalmente el esquema de una base de datos para mantenerlo sincronizado con el modelo de datos de una aplicación. Puede consultar más información sobre este patrón en Descripción general de las migraciones.

  1. Abra una ventana de terminal en la raíz del proyecto.

  2. Ejecute el siguiente comando para generar una migración inicial que pueda crear la base de datos:

    Add-Migration InitialCreate
    
  3. Debe aparecer la carpeta Migrations en el directorio del proyecto, junto con un archivo denominado InitialCreate con números únicos antepuestos. Ejecute la migración para crear la base de datos con el siguiente comando:

    Update-Database
    

    Las herramientas de Entity Framework Core crearán el esquema de la base de datos en Azure definido por la clase PersonDbContext.

Prueba de la aplicación de forma local

La aplicación está lista para probarse localmente. Asegúrese de que ha iniciado sesión en Visual Studio o en la CLI de Azure con la misma cuenta que ha establecido como administrador de la base de datos.

  1. Presione el botón Ejecutar en la parte superior de la ventana de Visual Studio para iniciar el proyecto de API.

  2. En la página de la interfaz de usuario de Swagger, expanda el método POST y seleccione Probar.

  3. Modifique el código JSON de ejemplo para incluir los valores de nombre y el apellido. Seleccione Ejecutar para agregar un nuevo registro a la base de datos. La API devuelve una respuesta correcta.

    Captura de pantalla que muestra cómo probar la API.

  4. Expanda el método GET en la página de la interfaz de usuario de Swagger y seleccione Pruébelo. Seleccione Ejecutar y se devolverá la persona que acaba de crear.

Implementación en Azure App Service

La aplicación está lista para implementarse en Azure. Visual Studio puede crear una instancia de Azure App Service e implementar la aplicación en un único flujo de trabajo.

  1. Asegúrese de que la aplicación se detiene y se compila correctamente.

  2. En la ventana Explorador de soluciones de Visual Studio, haga clic con el botón derecho en el nodo de proyecto del nivel superior y seleccione Publicar.

  3. En el cuadro de diálogo de publicación, seleccione Azure como destino de implementación y, después, seleccione Siguiente.

  4. Para el destino específico, elija Azure App Service (Windows) y seleccione Siguiente.

  5. Seleccione el icono + verde para crear una nueva instancia de App Service para implementarla y escriba los siguientes valores:

    • Nombre: deje el valor predeterminado.

    • Nombre de la suscripción: seleccione la suscripción en la que se va a realizar la implementación.

    • Grupo de recursos: seleccione Nuevo y cree un grupo de recursos denominado msdocs-dotnet-sql.

    • Plan de hospedaje: seleccione Nuevo para abrir el cuadro de diálogo Plan de hospedaje. Deje los valores predeterminados como están y seleccione Aceptar.

    • Seleccione Crear para cerrar el cuadro de diálogo original. Visual Studio crea un recurso de App Service en Azure.

      Captura de pantalla que muestra cómo realizar una implementación con Visual Studio.

  6. Una vez que se crea el recurso, asegúrese de que está seleccionado en la lista de servicios de aplicaciones y, después, seleccione Siguiente.

  7. En el paso API Management, seleccione la casilla Omitir este paso en la parte inferior y elija Finalizar.

  8. Seleccione Publicar en la esquina superior derecha del resumen del perfil de publicación para implementar la aplicación en Azure.

Cuando finaliza la implementación, Visual Studio inicia el explorador para mostrar la aplicación hospedada, pero en este momento la aplicación no funciona correctamente en Azure. Todavía debe configurar la conexión segura entre la instancia de App Service y la base de datos SQL para recuperar los datos.

Conexión de App Service a Azure SQL Database

Los pasos siguientes son necesarios para conectar la instancia de App Service a Azure SQL Database:

  1. Cree una identidad administrada para App Service. La biblioteca Microsoft.Data.SqlClient incluida en la aplicación detectará automáticamente la identidad administrada, al igual que detectó el usuario local de Visual Studio.
  2. Cree un usuario de SQL Database y asócielo a la identidad administrada de App Service.
  3. Asigne roles de SQL al usuario de la base de datos que le concedan permisos de lectura, escritura y quizá otros permisos.

Hay varias herramientas disponibles para implementar estos pasos:

El conector de servicio es una herramienta que simplifica las conexiones autenticadas entre distintos servicios de Azure. Actualmente, el conector de servicio admite la conexión de una instancia de App Service a una base de datos SQL a través de la CLI de Azure, con el comando az webapp connection create sql. Este único comando completa los tres pasos mencionados anteriormente.

az webapp connection create sql
-g <your-resource-group>
-n <your-app-service-name>
--tg <your-database-server-resource-group>
--server <your-database-server-name>
--database <your-database-name>
--system-identity

Puede comprobar los cambios realizados por el conector de servicio en la configuración de App Service.

  1. Vaya a la página Identidad de la instancia de App Service. En la pestaña Asignado por el sistema, el Estado debe establecerse en Activado. Este valor significa que se habilitó una identidad administrada asignada por el sistema para la aplicación.

  2. Vaya a la página Configuración de la instancia de App Service. En la pestaña Cadenas de conexión, debe aparecer la cadena de conexión AZURE_SQL_CONNECTIONSTRING. Seleccione el texto Haga clic aquí para mostrar el valor para ver la cadena de conexión sin contraseña que se ha generado. El nombre de esta cadena de conexión está en línea con el que configuró en la aplicación, por lo que se detectará automáticamente al ejecutarse en Azure.

Importante

Aunque esta solución proporciona un enfoque sencillo para empezar, no es un procedimiento recomendado para entornos de producción empresariales. En esos escenarios, la aplicación no debe realizar todas las operaciones con una única identidad con privilegios elevados. Debe intentar implementar el principio de privilegios mínimos configurando varias identidades con permisos específicos para tareas específicas.

Puede consultar más información sobre cómo configurar roles de base de datos y seguridad en los siguientes recursos:

Tutorial: Protección de una base de datos en Azure SQL Database

Autorización del acceso de base de datos a SQL Database

Prueba de la aplicación implementada

Vaya a la dirección URL de la aplicación para probar que funciona la conexión a Azure SQL Database. Puede encontrar la dirección URL de la aplicación en la página de información general de App Service. Incluya la ruta de acceso /person al final de la dirección URL para ir al mismo punto de conexión que ha probado localmente.

La persona que creó localmente debe mostrarse en el explorador. ¡Enhorabuena! La aplicación ahora está conectada a Azure SQL Database en entornos locales y hospedados.

Limpiar los recursos

Cuando haya terminado de trabajar con Azure SQL Database, elimine el recurso para evitar costos no previstos.

  1. En la barra de búsqueda de Azure Portal, busque Azure SQL y seleccione el resultado coincidente.

  2. Busque y seleccione la base de datos en la lista de bases de datos.

  3. En la página Información general de Azure SQL Database, seleccione Eliminar.

  4. En la página Está seguro de que quiere eliminar… de Azure que se abre, escriba el nombre de la base de datos para confirmar y, después, seleccione Eliminar.