Condividi tramite


Connettersi a Database SQL di Azure ed eseguire query sui dati usando .NET ed Entity Framework Core

Si applica a:Database SQL di Azure

Questa guida di avvio rapido descrive come connettere un'applicazione a un database in Database SQL di Azure ed eseguire query usando .NET e Entity Framework Core. Questa guida di avvio rapido segue l'approccio senza password consigliato per connettersi al database. Altre informazioni sulle connessioni senza password sono disponibili nell'hub senza password.

Prerequisiti

Configurazione del server database

La connessione sicura senza password a Database SQL di Azure richiede determinate configurazioni del database. Verificare le impostazioni seguenti nel server logico in Azure per connettersi correttamente a Database SQL di Azure in ambienti locali e ospitati:

  1. Per le connessioni di sviluppo locale, verificare che il server logico sia configurato per consentire all'indirizzo IP del computer locale e ad altri servizi di Azure di connettersi:

    • Passare alla pagina Rete del server.

    • Attivare o disattivare il pulsante di opzione Reti selezionate per visualizzare ulteriori opzioni di configurazione.

    • Selezionare Aggiungere l'indirizzo IPv4 client (xx.xx.xx.xx.xx) per aggiungere una regola del firewall che consentirà le connessioni dall'indirizzo IPv4 del computer locale. In alternativa, è anche possibile selezionare + Aggiungi una regola del firewall per immettere un indirizzo IP specifico a propria scelta.

    • Selezionare la casella di controllo Consenti alle risorse e ai servizi di Azure di accedere a questo server.

      Screenshot che mostra come configurare le regole del firewall.

      Avviso

      L'abilitazione dell'impostazione Consenti a servizi e risorse di Azure di accedere a questo server non è una procedura di protezione consigliata per gli scenari di produzione. Le applicazioni reali devono implementare approcci più sicuri, ad esempio restrizioni firewall più avanzate o configurazioni di reti virtuali.

      Per altre informazioni sulle configurazioni di sicurezza del database, vedere le seguenti risorse:

  2. Al server deve essere abilitata anche l'autenticazione Microsoft Entra e deve essere assegnato un account amministratore di Microsoft Entra. Per le connessioni di sviluppo locali, l'account amministratore di Microsoft Entra deve essere un account con il quale è possibile accedere localmente anche a Visual Studio o all'interfaccia della riga di comando di Azure. È possibile verificare se nel server è abilitata l'autenticazione Microsoft Entra dalla pagina Microsoft Entra ID del server logico.

    Screenshot che mostra come abilitare l'autenticazione di Microsoft Entra.

  3. If you're using a personal Azure account, make sure you have Microsoft Entra setup and configured for Azure SQL Database in order to assign your account as a server admin. If you're using a corporate account, Microsoft Entra ID will most likely already be configured for you.

Creare il progetto

I passaggi descritti in questa sezione creano un'API Web minima .NET usando l'interfaccia della riga di comando di .NET o Visual Studio 2022.

  1. Nella barra dei menu di Visual Studio, passare a File>Nuovo>Progetto...

  2. Nella finestra di dialogo, immettere ASP.NET nella casella di ricerca del modello di progetto e selezionare il risultato dell'API Web ASP.NET Core. Selezionare Avanti nella parte inferiore della finestra di dialogo.

  3. Per il Nome progetto, immettere DotNetSQL. Lasciare i valori predefiniti per i campi rimanenti, quindi selezionare Avanti.

  4. For the Framework, select .NET 9.0 and uncheck Use controllers. Questa guida di avvio rapido usa un modello di API minimo per semplificare la creazione e la configurazione degli endpoint.

  5. Choose Create. Il nuovo progetto si apre nell'ambiente di Visual Studio.

Aggiungere Entity Framework Core al progetto

Per connettersi a Database SQL di Azure usando .NET ed Entity Framework Core, è necessario aggiungere tre pacchetti NuGet al progetto mediante uno dei metodi seguenti:

  1. Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sul nodoDipendenze del progetto, quindi selezionare Gestisci pacchetti NuGet.

  2. Nella finestra generata, cercare EntityFrameworkCore. Individuare e installare i pacchetti seguenti:

  • Microsoft.EntityFrameworkCore: Provides essential Entity Framework Core functionality
  • Microsoft.EntityFrameworkCore.SqlServer: Provides extra components to connect to the logical server
  • Microsoft.EntityFrameworkCore.Design: Provides support for running Entity Framework migrations
  • Microsoft.EntityFrameworkCore.Tools: Provides support for Visual Studio Package Manager Console tooling (PowerShell only)
  • Swashbuckle.AspNetCore: Optional - provides support for SwaggerUI interaction with the app endpoints

Aggiungere il codice per connettersi al database SQL di Azure

Le librerie Entity Framework Core si basano sulle librerie Microsoft.Data.SqlClient e Azure.Identity per implementare connessioni senza password a database SQL di Azure. La libreria Azure.Identity fornisce una classe denominata DefaultAzureCredential che gestisce l'autenticazione senza password in Azure.

DefaultAzureCredential supporta più metodi di autenticazione e determina quello da usare in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (locale o di produzione) senza implementare codice specifico dell'ambiente. La panoramica della libreria di identità di Azure illustra l'ordine e le posizioni in cui DefaultAzureCredential cerca le credenziali.

Completare i passaggi seguenti per connettersi a database SQL di Azure usando Entity Framework Core e la classe DefaultAzureCredential sottostante:

  1. Aggiungere una sezione ConnectionStrings al file appsettings.Development.json in modo che corrisponda al codice seguente. Replace <server>.database.windows.net with the name of the passwordless database server you want to connect to, and <database> with the name of the database.

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "ConnectionStrings": {
            "AZURE_SQL_CONNECTIONSTRING": "Data Source=<server>.database.windows.net;Initial Catalog=<database>;Authentication=Active Directory Default;Encrypt=True;"
        }
    }
    

    Nota

    Remember to update the <your database-server-name> and <your-database-name> placeholders in the database connection string. Passwordless connection strings are safe to commit to source control, since they don't contain any secrets such as usernames, passwords, or access keys.

    La stringa di connessione senza password comprende un valore di configurazione di Authentication=Active Directory Default, che consente a Entity Framework Core di usare DefaultAzureCredential per connettersi ai servizi di Azure. Quando l'app viene eseguita in locale, esegue l'autenticazione con l'utente con cui si è connessi a Visual Studio. Once the app deploys to Azure, the same code discovers and applies the managed identity that is associated with the hosted app, which you configure later.

  2. Sostituire il contenuto del file Program.cs con il codice seguente:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    
    var builder = WebApplication.CreateBuilder();
    
    builder.Services.AddOpenApi();
    
    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));
    
    var app = builder.Build();
    
    if (app.Environment.IsDevelopment())
    {
        app.MapOpenApi();
        app.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/openapi/v1.json", "v1");
        });
    }
    
    app.MapGet("/", () => "Hello world!");
    
    app.MapGet("/Person", (PersonDbContext context) =>
    {
        return context.Person.ToList();
    });
    
    app.MapPost("/Person", (Person person, PersonDbContext context) =>
    {
        context.Add(person);
        context.SaveChanges();
    });
    
    app.Run();
    
    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; }
    }
    

    The preceding code handles the following steps:

    • Recupera la stringa di connessione al database senza password dal file appsettings.Development.json per lo sviluppo locale, o dalle variabili di ambiente per gli scenari di produzione ospitati.
    • Registra la classe DbContext Entity Framework Core con il contenitore di inserimento delle dipendenze .NET. Per altre informazioni su DbContext, vedere la documentazione introduttiva di Entity Framework Core.
    • Configures .NET 9.0 OpenAPI support with SwaggerUI to provide a UI you can use to interact with the app endpoints and database.
    • Adds endpoints to retrieve and add entities in the database.
    • Defines a Person class to represent a single record in the Persons database table, and the PersonDbContext class that was registered with the .NET dependency injection container.

Eseguire migrazioni per creare il database

Per aggiornare lo schema del database affinché corrisponda al modello di dati tramite Entity Framework Core, è necessario usare una migrazione. Le migrazioni possono creare e aggiornare in modo incrementale uno schema del database per mantenerlo sincronizzato con il modello di dati dell'applicazione. Per altre informazioni su questo modello, vedere la panoramica delle migrazioni.

  1. Apri una finestra del terminale nella directory principale del tuo progetto.

  2. Eseguire il comando seguente per generare una migrazione iniziale che possa creare il database:

    Add-Migration InitialCreate
    

  1. Una cartella Migrations dovrebbe essere visualizzata nella directory del progetto, insieme a un file denominato InitialCreate con numeri univoci anteposti. Eseguire la migrazione per creare il database tramite il comando seguente:

    Update-Database
    

The Entity Framework Core tooling creates the database schema in Azure defined by the PersonDbContext class.

Test dell'app in locale

L'app è pronta per essere testata a livello locale. Assicurarsi di aver eseguito l'accesso a Visual Studio o all'interfaccia della riga di comando di Azure con lo stesso account che è stato impostato come amministratore per il database.

  1. Premere il pulsante di esecuzione nella parte superiore di Visual Studio per avviare il progetto API.

  2. Nella pagina dell'interfaccia utente di Swagger, espandere il metodo POST e selezionare Prova.

  3. Modify the sample JSON to include values for the first name and family name. Selezionare Esegui per aggiungere un nuovo record al database. L'API restituisce una risposta di esito positivo.

    Screenshot che mostra come testare l'API.

  4. Espandere il metodo GET nella pagina dell'interfaccia utente di Swagger, quindi selezionare Prova. Selezionare Esegui e, in questo modo, viene restituita la persona appena creata.

Deploy to Azure App Service

L'app è pronta per essere distribuita in Azure. Visual Studio può creare un servizio app di Azure per distribuire l'applicazione in un singolo flusso di lavoro.

  1. Make sure the app is stopped and builds successfully.

  2. Nella finestra Esplora soluzioni di Visual Studio, fare clic con il pulsante destro del mouse sul nodo del progetto di primo livello e scegliere Pubblica.

  3. Nella finestra di dialogo di pubblicazione selezionare Azure come destinazione di distribuzione, quindi selezionare Avanti.

  4. Per la destinazione specifica, selezionare Servizio app di Azure (Windows), quindi scegliere Avanti.

  5. Selezionare l'icona + verde per creare un nuovo servizio app in cui eseguire la distribuzione e immettere i valori seguenti:

    • Nome: lasciare il valore predefinito.

    • Subscription name: Select the subscription to deploy to.

    • Gruppo di risorse: selezionare Nuovo e creare un nuovo gruppo di risorse denominato msdocs-dotnet-sql.

    • Piano di hosting: selezionare Nuovo per aprire la finestra di dialogo del piano di hosting. Lasciare i valori predefiniti, quindi selezionare OK.

    • Selezionare Crea per chiudere la finestra di dialogo iniziale. Visual Studio crea la risorsa App Service su Azure.

      Screenshot che mostra come eseguire la distribuzione con Visual Studio.

  6. Once the resource is created, make sure you select in the list of app services, and then select Next.

  7. Nel passaggio Gestione API, selezionare la casella di controllo Salta questo passaggio nella parte inferiore, quindi selezionare Fine.

  8. Selezionare Pubblica nella parte in alto a destra del riepilogo del profilo di pubblicazione per distribuire l'app in Azure.

When the deployment finishes, Visual Studio launches the browser to display the hosted app. You should see the Hello world message from the default endpoint. However, at this point the database endpoints don't work correctly on Azure. È comunque necessario configurare la connessione protetta tra il servizio app e il database SQL per recuperare i dati.

Connettere il servizio app al database SQL di Azure

Per connettere l'istanza del servizio app a Database SQL di Azure sono necessari i passaggi seguenti:

  1. Creare un'identità gestita per il servizio app. The Microsoft.Data.SqlClient library included in your app automatically discovers the managed identity, just like it discovered your local Visual Studio user.
  2. Creare un utente del database SQL e associarlo all'identità gestita del servizio app.
  3. Assegnare ruoli SQL all'utente del database che consentano di leggere, scrivere e potenzialmente di ottenere altre autorizzazioni.

Sono disponibili vari strumenti per implementare questi passaggi:

Connettore di servizi è uno strumento che semplifica le connessioni autenticate tra vari servizi in Azure. Service Connector currently supports connecting an App Service to a SQL database using the Azure CLI passwordless extension.

  1. Install or upgrade the Service Connector passwordless extension:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. Run the az webapp connection create sql command to connect your web app to the database using a system-assigned managed identity. Replace the placeholders with appropriate values:

    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
    

È possibile verificare le modifiche apportate dal connettore di servizi nelle impostazioni dei servizi app.

  1. Passare alla pagina Identità del tuo servizio App. Nella scheda Assegnata dal sistema , lo Stato deve essere impostato su Attivato. Questo valore indica che è stata abilitata un'identità gestita assegnata dal sistema per l'app.

  2. Passare alla pagina Configurazione per il servizio app. Under the Connection strings tab, you should see a connection string called AZURE_SQL_CONNECTIONSTRING. Selezionare il testo Fare clic per visualizzare il valore per visualizzare la stringa di connessione senza password generata. The name of this connection string aligns with the one you configured in your app, so it's discovered automatically when running in Azure.

Important

Although this solution provides a simple approach for getting started, it isn't a best practice for enterprise production environments. In those scenarios the app shouldn't perform all operations using a single, elevated identity. Si consiglia di provare ad adottare il principio dei privilegi minimi configurando più identità con autorizzazioni specifiche per attività specifiche. For more information about configuring database roles and security, see:

Testare l'applicazione distribuita

Passare all'URL dell'app per testare il funzionamento della connessione al database SQL di Azure. È possibile individuare l'URL dell'app nella pagina di panoramica del servizio app. Accodare il percorso /person alla fine dell'URL per passare allo stesso endpoint testato in locale.

La persona creata in locale verrà visualizzata nel browser. Congratulations, your application is now connected to Azure SQL Database in both local and hosted environments.

Pulire le risorse

Al termine dell'utilizzo del database SQL di Azure, eliminare la risorsa per evitare costi accidentali.

  1. Nella barra di ricerca del portale di Azure, cercare Azure SQL e selezionare il risultato corrispondente.

  2. Individuare e selezionare il proprio database nell'elenco dei database.

  3. Nella pagina Panoramica del database SQL di Azure, selezionare Elimina.

  4. Nella pagina Azure: vuoi davvero eliminare... che viene visualizzata, digitare il nome del database per confermare, quindi selezionare Elimina.

Nota

If you deployed the sample app to Azure, make sure to also search for and delete the App Service resource to avoid unintended costs.