Share via


Connessione a database SQL di Azure ed esecuzione di query usando .NET e la libreria Microsoft.Data.SqlClient

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 la libreria Microsoft.Data.SqlClient. 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

Configurare il 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.

      A screenshot showing how to configure firewall rules.

      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.

    A screenshot showing how to enable Microsoft Entra authentication.

  3. Se si usa un account Azure personale, assicurarsi di avere impostato Microsoft Entra e che sia configurato per Database SQL di Azure per poter assegnare l'account come amministratore del server. Se si usa un account aziendale, è probabile che Microsoft Entra ID sia già configurato automaticamente.

Creare il progetto

Per i passaggi successivi, creare un'API Web minima .NET usando l'interfaccia della riga di comando di .NET o Visual Studio 2022.

  1. Nel 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. Per il Framework, selezionare .NET 7.0 e deselezionare Usa controller (deselezionare per usare API minime). Questa guida di avvio rapido usa un modello di API minimo per semplificare la creazione e la configurazione degli endpoint.

  5. Scegliere Create (Crea). Il nuovo progetto si apre nell'ambiente di Visual Studio.

Aggiungere la libreria Microsoft.Data.SqlClient

Per connettersi al database SQL di Azure tramite .NET, installare Microsoft.Data.SqlClient. Questo pacchetto funge da provider di dati per effettuare una connessione a database, eseguire comandi e recuperare risultati.

Nota

Verificare di installare Microsoft.Data.SqlClient e non System.Data.SqlClient. Microsoft.Data.SqlClient è una versione più recente della libreria client SQL che offre funzionalità aggiuntive.

  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 SqlClient. Individuare il risultato Microsoft.Data.SqlClient e selezionare Installa.

Configurare la stringa di connessione

Per lo sviluppo locale con connessioni senza password a database SQL di Azure, aggiungere la seguente sezione ConnectionStrings al file appsettings.json. Sostituire i segnaposto <database-server-name> e <database-name> con i propri valori.

"ConnectionStrings": {
    "AZURE_SQL_CONNECTIONSTRING": "Server=tcp:<database-server-name>.database.windows.net,1433;Initial Catalog=<database-name>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=\"Active Directory Default\";"
}

La stringa di connessione senza password imposta un valore di configurazione di Authentication="Active Directory Default", che indica alla libreria Microsoft.Data.SqlClient di connettersi a database SQL di Azure usando una classe denominata DefaultAzureCredential. DefaultAzureCredential consente connessioni senza password ai servizi di Azure e viene fornita dalla libreria di Identità di Azure da cui dipende la libreria client SQL. DefaultAzureCredential supporta più metodi di autenticazione e stabilisce quello da usare in fase di esecuzione per vari ambienti.

Ad esempio, quando l'app viene eseguita in locale, DefaultAzureCredential esegue l'autenticazione tramite l'utente con cui si è connessi a Visual Studio o altri strumenti locali, come l'interfaccia della riga di comando di Azure. Dopo la distribuzione dell'app in Azure, lo stesso codice individua e applica l'identità gestita associata all'app ospitata, che verrà configurata successivamente. La panoramica della libreria di identità di Azure illustra l'ordine e le posizioni in cui DefaultAzureCredential cerca le credenziali.

Nota

Le stringhe di connessione senza password sono sicure per l’esecuzione del commit nel controllo del codice sorgente, poiché non contengono segreti quali nomi utente, password o chiavi di accesso.

Aggiungere il codice per connettersi al database SQL di Azure

Sostituire il contenuto del file Program.cs con il codice seguente, che esegue questi passaggi fondamentali:

  • Recupera la stringa di connessione senza password da appsettings.json
  • Crea una tabella Persons nel database durante l'avvio (solo per scenari di test)
  • Crea un endpoint HTTP GET per recuperare tutti i record archiviati nella tabella Persons
  • Crea un endpoint HTTP POST per aggiungere nuovi record alla tabella Persons
using Microsoft.Data.SqlClient;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// For production scenarios, consider keeping Swagger configurations behind the environment check
// if (app.Environment.IsDevelopment())
// {
    app.UseSwagger();
    app.UseSwaggerUI();
// }

app.UseHttpsRedirection();

string connectionString = app.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING")!;

try
{
    // Table would be created ahead of time in production
    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand(
        "CREATE TABLE Persons (ID int NOT NULL PRIMARY KEY IDENTITY, FirstName varchar(255), LastName varchar(255));",
        conn);
    using SqlDataReader reader = command.ExecuteReader();
}
catch (Exception e)
{
    // Table may already exist
    Console.WriteLine(e.Message);
}

app.MapGet("/Person", () => {
    var rows = new List<string>();

    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand("SELECT * FROM Persons", conn);
    using SqlDataReader reader = command.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            rows.Add($"{reader.GetInt32(0)}, {reader.GetString(1)}, {reader.GetString(2)}");
        }
    }

    return rows;
})
.WithName("GetPersons")
.WithOpenApi();

app.MapPost("/Person", (Person person) => {
    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand(
        "INSERT INTO Persons (firstName, lastName) VALUES (@firstName, @lastName)",
        conn);

    command.Parameters.Clear();
    command.Parameters.AddWithValue("@firstName", person.FirstName);
    command.Parameters.AddWithValue("@lastName", person.LastName);

    using SqlDataReader reader = command.ExecuteReader();
})
.WithName("CreatePerson")
.WithOpenApi();

app.Run();

Infine, aggiungere la classe Person in fondo al file Program.cs. Questa classe rappresenta un record singolo nella tabella Persons del database.

public class Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}

Eseguire e testare l'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. Modificare il campione JSON affinché includa i valori di nome e cognome. Selezionare Esegui per aggiungere un nuovo record al database. L'API restituisce una risposta di esito positivo.

    A screenshot showing how to test the API.

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

Distribuire nel Servizio app di Azure

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. Verificare che l'app venga arrestata e compilata correttamente.

  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 + per creare un nuovo servizio app in cui eseguire la distribuzione e immettere i valori seguenti:

    • Nome: lasciare il valore predefinito.

    • Nome sottoscrizione: selezionare la sottoscrizione per distribuirla.

    • 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 del servizio app in Azure.

      A screenshot showing how to deploy with Visual Studio.

  6. Dopo aver creato la risorsa, assicurarsi che sia selezionata nell'elenco dei servizi app, quindi selezionare Avanti.

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

  8. Nel passaggio Fine, selezionare Chiudi se la finestra di dialogo non viene chiusa automaticamente.

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

Al termine della distribuzione Visual Studio avvia il browser per visualizzare l'app ospitata, ma a questo punto l'app non funziona correttamente in 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 creare una connessione senza password tra l'istanza del servizio app e Database SQL di Azure sono necessari i passaggi seguenti:

  1. Creare un'identità gestita per il servizio app. La libreria Microsoft.Data.SqlClient inclusa nell'app individuerà automaticamente l'identità gestita, nello stesso modo in cui ha individuato l'utente Visual Studio locale.
  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. Connettore di servizi supporta attualmente la connessione di un servizio app a un database SQL tramite l'interfaccia della riga di comando di Azure mediante il comando az webapp connection create sql. Questo singolo comando completa i tre passaggi indicati precedentemente.

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

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

  1. Passare alla pagina Identità per il 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. Nella scheda Stringhe di connessione verrà visualizzata una stringa di connessione denominata AZURE_SQL_CONNECTIONSTRING. Selezionare il testo Fare clic per visualizzare il valore per visualizzare la stringa di connessione senza password generata. Il nome della stringa di connessione corrisponde a quello configurato nell'app, in modo che venga individuata automaticamente quando è in esecuzione in Azure.

Importante

Questa soluzione offre un approccio semplice per iniziare, ma non è una procedura consigliata per ambienti di livello di produzione. In tali scenari l'app non deve eseguire tutte le operazioni mediante un'unica identità con privilegi elevati. Si consiglia di provare ad adottare il principio dei privilegi minimi configurando più identità con autorizzazioni specifiche per attività specifiche.

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

Testare l'applicazione distribuita

  1. Selezionare il pulsante Sfoglia nella parte superiore della pagina di panoramica del servizio app per avviare l'URL radice dell'app.

  2. Accodare il percorso /swagger/index.html all'URL per caricare la stessa pagina di test di Swagger usata in locale.

  3. Eseguire le richieste GET e POST di test per verificare che gli endpoint funzionino come previsto.

Suggerimento

Se si ottiene un messaggio 500 - Errore interno del server durante il test, ciò potrebbe essere dovuto alle configurazioni di rete del database. Verificare che il server logico sia configurato con le impostazioni illustrate nella sezione Configurare il database.

Complimenti. L'applicazione è ora connessa al database SQL di Azure in ambienti locali e ospitati.

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.