Connessione ad Azure SQL con l'autenticazione di Microsoft Entra e SqlClient

Si applica a: .NET Framework .NET Standard

Scarica ADO.NET

Questo articolo descrive come connettersi alle origini dati di Azure SQL usando l'autenticazione di Microsoft Entra da un'applicazione .NET con SqlClient.

Nota

Anche se Microsoft Entra ID è il nuovo nome per Azure Active Directory (Azure AD), per evitare l'interruzione degli ambienti esistenti, Azure AD rimane ancora in alcuni elementi codificati, ad esempio campi dell'interfaccia utente, provider di connessioni, codici di errore e cmdlet. In questo articolo i due nomi sono intercambiabili.

Panoramica

L'autenticazione Microsoft Entra utilizza le identità in Microsoft Entra ID per accedere a fonti di dati come Database SQL di Azure, Istanza gestita di SQL di Azure e Azure Synapse Analytics. Lo spazio dei nomi Microsoft.Data.SqlClient consente alle applicazioni client di specificare le credenziali di Microsoft Entra in modalità di autenticazione diverse quando si connettono al database SQL di Azure e all’Istanza gestita di SQL di Azure. Per usare l'autenticazione di Microsoft Entra con Azure SQL, è necessario configurare e gestire l'autenticazione di Microsoft Entra con Azure SQL.

Quando si imposta la proprietà di connessione Authentication nella stringa di connessione, il client può scegliere una modalità di autenticazione preferita per Microsoft Entra in base al valore specificato:

  • La versione meno recente di Microsoft.Data.SqlClient supporta Active Directory Password per .NET Framework, .NET Core e .NET Standard. Supporta inoltre l'autenticazione Active Directory Integrated e l'autenticazione Active Directory Interactive per .NET Framework.

  • A partire da Microsoft.Data.SqlClient 2.0.0 il supporto per l'autenticazione Active Directory Integrated e l'autenticazione Active Directory Interactive è esteso a .NET Framework, .NET Core e .NET Standard.

    Viene inoltre aggiunta in SqlClient 2.0.0 una nuova modalità di autenticazione Active Directory Service Principal che consente di usare l'ID client e il segreto di un'identità dell'entità servizio per eseguire l'autenticazione.

  • Altre modalità di autenticazione sono state aggiunte in Microsoft.Data.SqlClient 2.1.0, tra cui Active Directory Device Code Flow e Active Directory Managed Identity (nota anche come Active Directory MSI). Queste nuove modalità consentono all'applicazione di acquisire un token di accesso per la connessione al server.

Per informazioni sull'autenticazione di Microsoft Entra oltre a quanto descritto nelle sezioni seguenti, vedere Usare l'autenticazione di Microsoft Entra.

Impostare l’autenticazione di Microsoft Entra

Quando si connette alle origini dati di Azure SQL usando l'autenticazione di Microsoft Entra, l'applicazione deve specificare una modalità di autenticazione valida. Nella tabella seguente sono elencate le modalità di autenticazione supportate. L'applicazione specifica una modalità utilizzando la proprietà di connessione Authentication nella stringa di connessione.

Valore Descrizione Versione di Microsoft.Data.SqlClient
Password di Active Directory Eseguire l'autenticazione con il nome utente e la password di un'identità Microsoft Entra 1.0+
Integrato in Active Directory Eseguire l'autenticazione con un'identità Microsoft Entra usando l'autenticazione integrata di Windows (IWA) 2.0.0+1
Autenticazione interattiva di Active Directory Eseguire l'autenticazione con un'identità di Microsoft Entra usando l'autenticazione interattiva 2.0.0+1
Entità servizio di Active Directory Eseguire l'autenticazione con un'entità servizio Microsoft Entra, usando l'ID client e il segreto 2.0.0+
Flusso di codice del dispositivo di Active Directory Eseguire l'autenticazione con un'identità di Microsoft Entra usando la modalità Flow di codice del dispositivo 2.1.0+
Identità gestita di Active Directory,
MSI di Active Directory
Eseguire l'autenticazione con un'identità gestita assegnata dal sistema Microsoft Entra o assegnata dall'utente 2.1.0+
Impostazione predefinita di Active Directory Eseguire l'autenticazione con un'identità di Microsoft Entra usando meccanismi senza password e non interattivi, tra cui identità gestite, Visual Studio Code, Visual Studio, interfaccia della riga di comando di Azure e così via. 3.0.0+
Identità del carico di lavoro di Active Directory Eseguire l'autenticazione con un'identità Microsoft Entra usando un'identità gestita assegnata dall'utente federata per connettersi a database SQL da ambienti client di Azure che hanno abilitato il supporto per l'identità del carico di lavoro. 5.2.0+

1 Prima di Microsoft.Data.SqlClient 2.0.0, le modalità di autenticazione di Active Directory Integrated e Active Directory Interactive sono supportate solo in .NET Framework.

Uso dell’autenticazione della password

La modalità di autenticazione Active Directory Password supporta l'autenticazione alle fonti di dati Azure con Microsoft Entra ID per gli utenti Microsoft Entra nativi o federati. Quando si usa questa modalità, è necessario specificare le credenziali utente nella stringa di connessione. Nell'esempio seguente viene illustrato come usare l'autenticazione Active Directory Password.

// Use your own server, database, user ID, and password.
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Password; Encrypt=True; Database=testdb; User Id=user@domain.com; Password=***";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

Uso dell'autenticazione integrata

Per usare la modalità di autenticazione Active Directory Integrated, è necessario disporre di un'istanza di Active Directory locale unita a Microsoft Entra ID nel cloud. La federazione può essere eseguita ad esempio con Active Directory Federation Services (AD FS).

Con questa modalità, quando si accede a un computer aggiunto a un dominio è possibile accedere alle origini dati di Azure SQL senza che vengano richieste le credenziali. Non è possibile specificare nome utente e password nella stringa di connessione per le applicazioni .NET Framework. Il nome utente è facoltativo nella stringa di connessione per le applicazioni .NET Core e .NET Standard. Non è possibile impostare la proprietà Credential di SqlConnection in questa modalità.

Il frammento di codice seguente è un esempio di utilizzo dell'autenticazione Active Directory Integrated.

// Use your own server and database.
string ConnectionString1 = @"Server=demo.database.windows.net; Authentication=Active Directory Integrated; Encrypt=True; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString1)) {
    conn.Open();
}

// User ID is optional for .NET Core and .NET Standard.
string ConnectionString2 = @"Server=demo.database.windows.net; Authentication=Active Directory Integrated; Encrypt=True; Database=testdb; User Id=user@domain.com";

using (SqlConnection conn = new SqlConnection(ConnectionString2)) {
    conn.Open();
}

Uso dell’autenticazione interattiva

L'autenticazione Active Directory Interactive supporta la tecnologia di autenticazione a più fattori per la connessione alle origini dati di Azure SQL. Se si specifica questa modalità di autenticazione nella stringa di connessione, verrà visualizzata una schermata di autenticazione di Azure in cui viene chiesto all'utente di immettere credenziali valide. Non è possibile specificare la password nella stringa di connessione.

Non è possibile impostare la proprietà Credential di SqlConnection in questa modalità. Con Microsoft.Data.SqlClient 2.0.0 e versioni successive, il nome utente è consentito nella stringa di connessione quando si è in modalità interattiva.

Nell'esempio seguente viene illustrato come usare l'autenticazione Active Directory Interactive.

// Use your own server, database, and user ID.
// User ID is optional.
string ConnectionString1 = @"Server=demo.database.windows.net; Authentication=Active Directory Interactive; Encrypt=True; Database=testdb; User Id=user@domain.com";

using (SqlConnection conn = new SqlConnection(ConnectionString1)) {
    conn.Open();
}

// User ID is not provided.
string ConnectionString2 = @"Server=demo.database.windows.net; Authentication=Active Directory Interactive; Encrypt=True; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString2)) {
    conn.Open();
}

Uso dell'autenticazione basata sull'entità servizio

In modalità di autenticazione Active Directory Service Principal l'applicazione client può connettersi alle origini dati di Azure SQL specificando l'ID client e il segreto di un'identità dell'entità servizio. L'autenticazione con entità servizio prevede quanto segue:

  1. Configurazione di una registrazione dell'app con un segreto.
  2. Concessione delle autorizzazioni all'app nell'istanza del database SQL di Azure.
  3. Connessione con le credenziali corrette.

Nell'esempio seguente viene illustrato come usare l'autenticazione Active Directory Service Principal.

// Use your own server, database, app ID, and secret.
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Service Principal; Encrypt=True; Database=testdb; User Id=AppId; Password=secret";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

Uso dell'autenticazione del flusso di codice del dispositivo

Con Microsoft Authentication Library per .NET (MSAL.NET), l'autenticazione Active Directory Device Code Flow consente all'applicazione client di connettersi alle origini dati di Azure SQL da dispositivi e sistemi operativi che non hanno un Web browser interattivo. L'autenticazione interattiva viene eseguita su un altro dispositivo. Per altre informazioni sull'autenticazione con flusso di codice del dispositivo, vedere Flusso di codice del dispositivo OAuth 2.0.

Non è possibile impostare la proprietà Credential di SqlConnection se questa modalità è in uso. Inoltre, il nome utente e la password non devono essere specificati nella stringa di connessione.

Il frammento di codice seguente è un esempio di utilizzo dell'autenticazione Active Directory Device Code Flow.

Nota

Timeout per impostazione Active Directory Device Code Flowpredefinita per l'impostazione della Connect Timeout connessione. Assicurarsi di specificare un Connect Timeout che fornisce tempo sufficiente per eseguire il processo di autenticazione del flusso del codice del dispositivo.

// Use your own server and database and increase Connect Timeout as needed for device code flow.
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Device Code Flow; Encrypt=True; Database=testdb; Connect Timeout=180;";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

Uso dell’autenticazione con identità gestita

L'autenticazione con identità gestite per le risorse di Azure è il metodo di autenticazione consigliato per l'accesso a SQL a livello di codice. Un'applicazione client può usare l'identità gestita assegnata dal sistema o assegnata dall'utente di una risorsa per eseguire l'autenticazione a SQL con Microsoft Entra ID, fornendo l'identità e usandola per ottenere i token di accesso. Questo metodo elimina la necessità di gestire credenziali e segreti e può semplificare la gestione degli accessi.

Sono disponibili due tipi di identità gestite:

  • L'identità gestita assegnata dal sistema viene creata come parte di una risorsa di Azure, ad esempio l'istanza gestita di SQL o il server logico, e condivide il ciclo di vita di tale risorsa. Le identità assegnate dal sistema possono essere associate solo a una singola risorsa di Azure.
  • Identità gestita assegnata dall'utente: viene creata come risorsa di Azure autonoma. Può essere assegnata a una o più istanze di un servizio di Azure.

Per altre informazioni sulle identità gestite, vedere Informazioni sulle identità gestite per le risorse di Azure.

A partire da Microsoft.Data.SqlClient 2.1.0 il driver supporta l'autenticazione nel database SQL di Azure, in Azure Synapse Analytics e in Istanza gestita di SQL di Azure con l'acquisizione di token di accesso attraverso l'identità gestita. Per usare questa autenticazione, specificare Active Directory Managed Identity o Active Directory MSI nella stringa di connessione e non è richiesta alcuna password. Inoltre, non è possibile impostare la proprietà Credential di SqlConnection in questa modalità.

Per un'identità gestita assegnata dall'utente, è necessario specificare l'ID client dell'identità gestita quando si usa Microsoft.Data.SqlClient v3.0 o versione successiva. Se si usa Microsoft.Data.SqlClient v2.1, è necessario specificare l'ID oggetto dell'identità gestita.

Nell'esempio seguente viene illustrato l'uso dell'autenticazione Active Directory Managed Identity con un'identità gestita assegnata dal sistema.

// For system-assigned managed identity
// Use your own values for Server and Database.
string ConnectionString1 = @"Server=demo.database.windows.net; Authentication=Active Directory Managed Identity; Encrypt=True; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString1)) {
    conn.Open();
}

string ConnectionString2 = @"Server=demo.database.windows.net; Authentication=Active Directory MSI; Encrypt=True; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString2)) {
    conn.Open();
}

L'esempio seguente illustra l'autenticazione Active Directory Managed Identity con un'identità gestita assegnata dall'utente con Microsoft.Data.SqlClient v3.0 e versioni successive.

// For user-assigned managed identity
// Use your own values for Server, Database, and User Id.

// With Microsoft.Data.SqlClient v3.0+
string ConnectionString1 = @"Server=demo.database.windows.net; Authentication=Active Directory Managed Identity; Encrypt=True; User Id=ClientIdOfManagedIdentity; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString1)) {
    conn.Open();
}

// With Microsoft.Data.SqlClient v3.0+
string ConnectionString2 = @"Server=demo.database.windows.net; Authentication=Active Directory MSI; Encrypt=True; User Id=ClientIdOfManagedIdentity; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString2)) {
    conn.Open();
}

L'esempio seguente illustra l'autenticazione Active Directory Managed Identity con un'identità gestita assegnata dall'utente con Microsoft.Data.SqlClient v2.1.

// For user-assigned managed identity
// Use your own values for Server, Database, and User Id.

// With Microsoft.Data.SqlClient v2.1
string ConnectionString1 = @"Server=demo.database.windows.net; Authentication=Active Directory Managed Identity; Encrypt=True; User Id=ObjectIdOfManagedIdentity; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString1)) {
    conn.Open();
}

// With Microsoft.Data.SqlClient v2.1
string ConnectionString2 = @"Server=demo.database.windows.net; Authentication=Active Directory MSI; Encrypt=True; User Id=ObjectIdOfManagedIdentity; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString2)) {
    conn.Open();
}

Uso dell’autenticazione predefinita

Disponibile a partire dalla versione 3.0, questa modalità di autenticazione amplia le possibilità di autenticazione utente. Questa modalità estende le soluzioni di accesso all'ambiente client, a Visual Studio Code, a Visual Studio, all'interfaccia della riga di comando di Azure e così via.

Con questa modalità di autenticazione, il driver acquisisce un token passando "DefaultAzureCredential" dalla libreria di Identità di Azure per acquisire un token di accesso. Questa modalità tenta di utilizzare un insieme di tipi di credenziali per acquisire un token di accesso in ordine. A seconda della versione della libreria di identità di Azure usata, il set di credenziali varia. Le differenze specifiche della versione sono indicate nell'elenco. Per il comportamento specifico della versione di Identità di Azure, vedere la documentazione dell'API Azure.Identity.

  • EnvironmentCredential
    • Consente l'autenticazione con Microsoft Entra tramite client e segreto o nome utente e password, i dettagli sono configurati nelle variabili di ambiente seguenti: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (altri dettagli)
  • WorkloadIdentityCredential
    • Abilita l’autenticazione degli ID dei carichi di lavoro di Microsoft Entra in Kubernetes e in altri host che supportano l'identità del carico di lavoro. Per maggiori informazioni, consultare la sezione ID dei carichi di lavoro di Microsoft Entra. Disponibile a partire da Azure Identity versione 1.10 e Microsoft.Data.SqlClient 5.1.4.
  • ManagedIdentityCredential
    • Tenta l'autenticazione con Microsoft Entra ID usando un'identità gestita assegnata all'ambiente di distribuzione. L'"ID client" di "Identità gestita assegnata dall'utente" viene letto dalla proprietà di connessione "ID utente".
  • SharedTokenCacheCredential
    • Esegue l'autenticazione usando i token nella cache locale condivisa tra le applicazioni Microsoft.
  • VisualStudioCredential
    • Abilita l'autenticazione con Microsoft Entra ID usando i dati di Visual Studio
  • VisualStudioCodeCredential
    • Abilita l'autenticazione con Microsoft Entra ID usando i dati di Visual Studio Code.
  • AzurePowerShellCredential
    • Abilita l'autenticazione con Microsoft Entra ID usando Azure PowerShell. Disponibile a partire da Identità di Azure versione 1.6 e Microsoft.Data.SqlClient 5.0.
  • AzureCliCredential
    • Abilita l'autenticazione con Microsoft Entra ID usando l'interfaccia della riga di comando di Azure per ottenere un token di accesso.
  • AzureDeveloperCliCredential
    • Consente l'autenticazione a Microsoft Entra ID usando Azure Developer CLI per ottenere un token di accesso. Disponibile a partire da Azure Identity versione 1.10 e Microsoft.Data.SqlClient 5.1.4.

Nota

InteractiveBrowserCredential è disabilitato nell'implementazione del driver "Active Directory predefinito" e "Active Directory interattivo" è l'unica opzione disponibile per acquisire un token tramite autenticazione MFA/interattiva.

Al momento non sono disponibili altre opzioni di personalizzazione.

Nell'esempio seguente viene illustrato come usare l'autenticazione predefinita di Active Directory.

// Use your own server, database
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Default; Encrypt=True; Database=testdb;";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

Uso dell'autenticazione dell'identità del carico di lavoro

Disponibile a partire dalla versione 5.2, ad esempio con le identità gestite, la modalità di autenticazione dell'identità del carico di lavoro usa il valore del parametro ID utente nella stringa di connessione per l'ID client, se specificato. A differenza dell'identità gestita, WorkloadIdentityCredentialOptions ne imposta il valore predefinito dalle variabili di ambiente: AZURE_TENANT_ID, AZURE_CLIENT_ID e AZURE_FEDERATED_TOKEN_FILE. Tuttavia, solo l'ID client può essere sottoposto a override dal stringa di connessione.

L'esempio seguente illustra Active Directory Workload Identity l'autenticazione con un'identità gestita assegnata dall'utente con Microsoft.Data.SqlClient v5.2 e versioni successive.

// Use your own values for Server, Database, and User Id.
// With Microsoft.Data.SqlClient v5.2+
string ConnectionString = @"Server=demo.database.windows.net; Authentication=Active Directory Workload Identity; Encrypt=True; User Id=ClientIdOfManagedIdentity; Database=testdb";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

Personalizzazione dell'autenticazione di Microsoft Entra

Oltre a usare l'autenticazione di Microsoft Entra integrata nel driver, Microsoft.Data.SqlClient 2.1.0 e versioni successive offrono alle applicazioni la possibilità di personalizzare l'autenticazione di Microsoft Entra. La personalizzazione è basata sulla classe ActiveDirectoryAuthenticationProvider, derivata dalla classe astratta SqlAuthenticationProvider.

Durante l'autenticazione di Microsoft Entra l'applicazione client può definire la propria classe ActiveDirectoryAuthenticationProvider in uno dei modi seguenti:

  • Usando un metodo di callback personalizzato.
  • Passando un ID client dell'applicazione alla libreria MSAL usando il driver SqlClient per recuperare i token di accesso.

Nell'esempio seguente viene illustrato come usare un callback personalizzato quando l'autenticazione Active Directory Device Code Flow è in uso.

using System;
using System.Threading.Tasks;
using Microsoft.Identity.Client;
using Microsoft.Data.SqlClient;

namespace CustomAuthenticationProviderExamples
{
    public class Program
    {
        public static void Main()
        {
            SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(CustomDeviceFlowCallback);
            SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, authProvider);
            using (SqlConnection sqlConnection = new SqlConnection("Server=<myserver>.database.windows.net;Authentication=Active Directory Device Code Flow;Database=<db>;"))
            {
                sqlConnection.Open();
                Console.WriteLine("Connected successfully!");
            }
        }

        private static Task CustomDeviceFlowCallback(DeviceCodeResult result)
        {
            // Provide custom logic to process result information and read device code.
            Console.WriteLine(result.Message);
            return Task.FromResult(0);
        }
    }
}

Con una classe ActiveDirectoryAuthenticationProvider personalizzata, un ID client dell'applicazione definito dall'utente può essere passato a SqlClient quando è in uso una modalità di autenticazione di Microsoft Entra supportata. Le modalità di autenticazione Microsoft Entra supportate includono Active Directory Password, Active Directory IntegratedActive Directory Interactive, Active Directory Service Principal, e Active Directory Device Code Flow.

L'ID client dell'applicazione può essere configurato anche usando SqlAuthenticationProviderConfigurationSection o SqlClientAuthenticationProviderConfigurationSection. La proprietà di configurazione applicationClientId si applica a .NET Framework 4.6 + e .NET Core 2.1 +.

Il frammento di codice seguente è un esempio di utilizzo di una classe ActiveDirectoryAuthenticationProvider personalizzata con un ID client dell'applicazione definito dall'utente quando è in uso l'autenticazione Active Directory Interactive.

using System;
using Microsoft.Data.SqlClient;

namespace CustomAuthenticationProviderExamples
{
    public class Program
    {
        public static void Main()
        {
            // Supported for all authentication modes supported by ActiveDirectoryAuthenticationProvider
            ActiveDirectoryAuthenticationProvider provider = new ActiveDirectoryAuthenticationProvider("<application_client_id>");
            if (provider.IsSupported(SqlAuthenticationMethod.ActiveDirectoryInteractive))
            {
                SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, provider);
            }
            
            using (SqlConnection sqlConnection = new SqlConnection("Server=<myserver>.database.windows.net;Authentication=Active Directory Interactive;Database=<db>;"))
            {
                sqlConnection.Open();
                Console.WriteLine("Connected successfully!");
            }
        }
    }
}

L'esempio seguente illustra come configurare un ID client dell'applicazione in una sezione di configurazione.

<configuration>
  <configSections>
    <section name="SqlClientAuthenticationProviders"
             type="Microsoft.Data.SqlClient.SqlClientAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" />
  </configSections>
  <SqlClientAuthenticationProviders applicationClientId ="<GUID>" />
</configuration>

<!--or-->

<configuration>
  <configSections>
    <section name="SqlAuthenticationProviders"
             type="Microsoft.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" />
  </configSections>
  <SqlAuthenticationProviders applicationClientId ="<GUID>" />
</configuration>

Supporto per un provider di autenticazione SQL personalizzato

Grazie a una maggiore flessibilità, l'applicazione client può usare anche il proprio provider per l'autenticazione di Microsoft Entra, anziché usare la classe ActiveDirectoryAuthenticationProvider. Il provider di autenticazione personalizzato deve essere una sottoclasse di SqlAuthenticationProvider con i metodi sottoposti a override. Deve quindi registrare il provider personalizzato, sostituendo uno o più dei metodi di autenticazione Active Directory* esistenti.

Nell'esempio seguente viene illustrato come usare un nuovo provider di autenticazione per l'autenticazione Active Directory Device Code Flow.

using System;
using System.Threading.Tasks;
using Microsoft.Identity.Client;
using Microsoft.Data.SqlClient;

namespace CustomAuthenticationProviderExamples
{
    /// <summary>
    /// Example demonstrating creating a custom device code flow authentication provider and attaching it to the driver.
    /// This is helpful for applications that wish to override the Callback for the Device Code Result implemented by the SqlClient driver.
    /// </summary>
    public class CustomDeviceCodeFlowAzureAuthenticationProvider : SqlAuthenticationProvider
    {
        public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
        {
            string clientId = "my-client-id";
            string clientName = "My Application Name";
            string s_defaultScopeSuffix = "/.default";

            string[] scopes = new string[] { parameters.Resource.EndsWith(s_defaultScopeSuffix) ? parameters.Resource : parameters.Resource + s_defaultScopeSuffix };

            IPublicClientApplication app = PublicClientApplicationBuilder.Create(clientId)
                .WithAuthority(parameters.Authority)
                .WithClientName(clientName)
                .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                .Build();

            AuthenticationResult result = await app.AcquireTokenWithDeviceCode(scopes,
                    deviceCodeResult => CustomDeviceFlowCallback(deviceCodeResult)).ExecuteAsync();
            return new SqlAuthenticationToken(result.AccessToken, result.ExpiresOn);
        }

        public override bool IsSupported(SqlAuthenticationMethod authenticationMethod) => authenticationMethod.Equals(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow);

        private Task CustomDeviceFlowCallback(DeviceCodeResult result)
        {
            Console.WriteLine(result.Message);
            return Task.FromResult(0);
        }
    }

    public class Program
    {
        public static void Main()
        {
            // Register our custom authentication provider class to override Active Directory Device Code Flow
            SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, new CustomDeviceCodeFlowAzureAuthenticationProvider());
            using (SqlConnection sqlConnection = new SqlConnection("Server=<myserver>.database.windows.net;Authentication=Active Directory Device Code Flow;Database=<db>;"))
            {
                sqlConnection.Open();
                Console.WriteLine("Connected successfully!");
            }
        }
    }
}

Oltre a migliorare l'esperienza di autenticazione Active Directory Interactive, Microsoft.Data.SqlClient 2.1.0 e versioni successive offrono le seguenti API per le applicazioni client per personalizzare l'autenticazione interattiva e l'autenticazione con flusso di codice del dispositivo.

public class ActiveDirectoryAuthenticationProvider
{
    // For .NET Framework targeted applications only
    // Sets a reference to the current System.Windows.Forms.IWin32Window that triggers the browser to be shown. 
    // Used to center the browser pop-up onto this window.
    public void SetIWin32WindowFunc(Func<IWin32Window> iWin32WindowFunc);

    // For .NET Standard targeted applications only
    // Sets a reference to the ViewController (if using Xamarin.iOS), Activity (if using Xamarin.Android) IWin32Window, or IntPtr (if using .NET Framework). 
    // Used for invoking the browser for Active Directory Interactive authentication.
    public void SetParentActivityOrWindowFunc(Func<object> parentActivityOrWindowFunc);

    // For .NET Framework, .NET Core, and .NET Standard targeted applications
    // Sets a callback method that's invoked with a custom web UI instance that will let the user sign in with Azure AD, present consent if needed, and get back the authorization code. 
    // Applicable when working with Active Directory Interactive authentication.
    public void SetAcquireAuthorizationCodeAsyncCallback(Func<Uri, Uri, CancellationToken, Task<Uri>> acquireAuthorizationCodeAsyncCallback);

    // For .NET Framework, .NET Core, and .NET Standard targeted applications
    // Clears cached user tokens from the token provider.
    public static void ClearUserTokenCache();
}

Vedi anche