Se connecter à Azure SQL avec l’authentification Microsoft Entra et SqlClient

S'applique à : .NET Framework .NET .NET Standard

Télécharger ADO.NET

Cet article explique comment se connecter aux sources de données Azure SQL à l’aide de l’authentification Microsoft Entra à partir d’une application .NET avec SqlClient.

Remarque

Bien que Microsoft Entra ID soit le nouveau nom d'Azure Active Directory (Azure AD) pour empêcher l'interruption des environnements existants, Azure AD reste toujours dans certains éléments codés en dur, tels que les champs d'interface utilisateur, les fournisseurs de connexions, les codes d'erreur et cmdlets. Dans cet article, les deux noms sont interchangeables.

Vue d’ensemble

L’authentification Microsoft Entra utilise des identités dans Microsoft Entra ID pour accéder aux sources de données comme la base de données Azure SQL, Azure SQL Managed Instance et Azure Synapse Analytics. L’espace de noms Microsoft.Data.SqlClient permet aux applications clientes de spécifier des informations d’identification Microsoft Entra dans différents modes d’authentification lorsqu’elles se connectent à la base de données Azure SQL et à Azure SQL Managed Instance. Pour utiliser l’authentification Microsoft Entra avec Azure SQL, vous devez configurer et gérer l’authentification Microsoft Entra avec Azure SQL.

Lorsque vous définissez la propriété de connexion Authentication dans la chaîne de connexion, le client peut choisir un mode d’authentification Microsoft Entra favori en fonction de la valeur fournie :

  • La version la plus ancienne Microsoft.Data.SqlClient prend en charge Active Directory Password pour .NET Framework, .NET Core et .NET Standard. Elle prend également en charge l’authentification Active Directory Integrated et l’authentification Active Directory Interactive pour .NET Framework.

  • À compter de Microsoft.Data.SqlClient 2.0.0, le support de l’authentification Active Directory Integrated et de l’authentification Active Directory Interactive est étendu sur .NET Framework, .NET Core et .NET Standard.

    Un nouveau mode d’authentification Active Directory Service Principal est également ajouté à SqlClient 2.0.0. Il utilise l’ID client et le secret d’une identité de principal du service pour effectuer l’authentification.

  • D’autres modes d’authentification sont ajoutés dans Microsoft.Data.SqlClient 2.1.0, y compris Active Directory Device Code Flow et Active Directory Managed Identity (également appelé Active Directory MSI). Ces nouveaux modes permettent à l’application d’acquérir un jeton d’accès pour se connecter au serveur.

Pour plus d’informations sur l’authentification Microsoft Entra au-delà de ce que décrivent les sections suivantes, consultez Utilisation de l’authentification Microsoft Entra.

Réglage de l'authentification Microsoft Entra

Lorsque l’application se connecte aux sources de données Azure SQL à l’aide de l’authentification Microsoft Entra, elle doit fournir un mode d’authentification valide. La table suivante répertorie les modes d’authentification pris en charge. L’application spécifie un mode à l’aide de la propriété de connexion Authentication dans la chaîne de connexion.

Value Description Version Microsoft.Data.SqlClient
Mot de passe Active Directory Authentification avec un nom d’utilisateur et un mot de passe d’une identité Microsoft Entra 1.0+
Intégration Active Directory Authentification avec une identité Microsoft Entra à l’aide de l’authentification intégrée de Windows (IWA) 2.0.0+1
Azure Directory interactif Authentification avec une identité Microsoft Entra à l’aide de l’authentification interactive 2.0.0+1
Principal de service Azure Directory Authentification avec un principal de service Microsoft Entra, à l’aide de son ID client et de sa clé secrète 2.0.0+
Flux de code de l’appareil Azure Directory Authentification avec une identité Microsoft Entra à l’aide du mode de flux de code de l’appareil 2.1.0+
Identité managée Active Directory,
MSI Active Directory
Authentification à l’aide d’une identité managée affectée par le système ou affectée par l’utilisateur Microsoft Entra 2.1.0+
Active Directory par défaut Authentifiez-vous avec une identité Microsoft Entra en utilisant des mécanismes sans mot de passe et non interactifs, notamment des identités managées, Visual Studio Code, Visual Studio, Azure CLI, etc. 3.0.0+
Identité de charge de travail Active Directory Authentifiez-vous avec une identité Microsoft Entra à l'aide d'une identité managée affectée par l'utilisateur fédéré pour vous connecter à SQL Database à partir d'environnements clients Azure qui ont activé la prise en charge de l'identité de charge de travail. 5.2.0+

1 Avant Microsoft.Data.SqlClient 2.0.0, les modes d’authentification Active Directory Integrated et Active Directory Interactive ne sont pris en charge que sur le .NET Framework.

Utilisation de l’authentification par mot de passe

Le mode d’authentification Active Directory Password prend en charge l’authentification auprès des sources de données Azure avec Microsoft Entra ID pour les utilisateurs Microsoft Entra natifs ou fédérés. Lorsque vous utilisez ce mode, les informations d’identification de l’utilisateur doivent être fournies dans la chaîne de connexion. L'exemple suivant indique comment utiliser l'authentification 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();
}

Utilisation de l’authentification intégrée

Pour utiliser le mode d’authentification Active Directory Integrated, vous devez disposer d’une instance Active Directory sur site jointe à Microsoft Entra ID dans le cloud. Vous pouvez effectuer une fédération en utilisant des services de fédération Active Directory (AD FS), par exemple.

Lorsque vous êtes connecté à un ordinateur joint à un domaine, vous pouvez accéder aux sources de données Azure SQL sans être invité à entrer des informations d’identification avec ce mode. Vous ne pouvez pas spécifier le nom d’utilisateur ni le mot de passe dans la chaîne de connexion pour les applications .NET Framework. Le nom d'utilisateur est facultatif dans la chaîne de connexion pour les applications .NET Core et .NET Standard. Vous ne pouvez pas définir la propriété Credential de SqlConnection dans ce mode.

L’extrait de code suivant est un exemple de l’utilisation en cours de l’authentification 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();
}

Utilisation de l’authentification interactive

L’authentification Active Directory Interactive prend en charge la technologie d’authentification multifacteur pour se connecter aux sources de données Azure SQL. Si vous fournissez ce mode d’authentification dans la chaîne de connexion, un écran d’authentification Azure s’affiche et demande à l’utilisateur d’entrer des informations d’identification valides. Vous pouvez indiquer le mot de passe dans la chaîne de connexion.

Vous ne pouvez pas définir la propriété Credential de SqlConnection dans ce mode. Avec Microsoft.Data.SqlClient 2.0.0 et versions ultérieures, le nom d’utilisateur est autorisé dans la chaîne de connexion lorsque vous êtes en mode interactif.

L'exemple suivant indique comment utiliser l'authentification 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();
}

Utilisation de l’authentification de principal de service

En mode d’authentification Active Directory Service Principal, l’application cliente peut se connecter aux sources de données Azure SQL en fournissant l’ID client et le secret d’une identité de principal du service. L’authentification du principal de service implique :

  1. Configuration d’une inscription d’application avec un secret.
  2. Octroi d’autorisations à l’application dans l’instance Azure SQL Database.
  3. Connexion avec les informations d’identification correctes.

L'exemple suivant indique comment utiliser l'authentification 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();
}

Utilisation de l’authentification du flux de code de l’appareil

Avec la bibliothèque d’authentification Microsoft pour .NET (MSAL.NET), l’authentification Active Directory Device Code Flow permet à l’application cliente de se connecter aux sources de données Azure SQL à partir d’appareils et de systèmes d’exploitation qui ne disposent pas d’un navigateur Web interactif. L’authentification interactive est effectuée sur un autre appareil. Pour plus d’informations sur l’authentification du flux de code de l’appareil, consultez Flux de code de l’appareil OAuth 2.0.

Lorsque ce mode est en cours d’utilisation, vous ne pouvez pas définir la propriété Credential de SqlConnection. En outre, le nom d’utilisateur et le mot de passe ne doivent pas être spécifiés dans la chaîne de connexion.

L’extrait de code suivant est un exemple de l’utilisation de l’authentification Active Directory Device Code Flow.

Notes

Par défaut, le délai d’expiration pour Active Directory Device Code Flow est défini sur le paramètre Connect Timeout de la connexion. Veillez à spécifier un Connect Timeout qui fournit suffisamment de temps pour exécuter le processus d’authentification du flux de code de l’appareil.

// 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();
}

Utilisation de l’authentification par identité managée

L’authentification avec des identités managées pour les ressources Azure est la méthode d’authentification recommandée pour l’accès programmatique à SQL. Une application cliente peut utiliser l’identité managée affectée par le système ou affectée par l’utilisateur d’une ressource pour s’authentifier auprès de SQL avec Microsoft Entra ID, en fournissant l’identité et en l’utilisant pour obtenir des jetons d’accès. Cette méthode peut éliminer la nécessité de gérer les informations d’identification et les secrets, et peut simplifier la gestion des accès.

Il existe deux types d’identités administrées :

  • L’identité managée affectée par le système est créée dans le cadre d’une ressource Azure (par exemple, votre instance managée par SQL ou le serveur logique) et partage le cycle de vie de cette ressource. Des identités attribuées par le système ne peuvent être associées qu’à une seule ressource Azure.
  • Une identité managée attribuée par l'utilisateur est créée en tant que ressource Azure autonome. Elle peut être attribuée à une ou plusieurs instances d’un service Azure.

Pour plus d’informations sur les identités managées, consultez À propos des identités managées pour les ressources Azure.

Depuis Microsoft.Data.SqlClient 2.1.0, le pilote prend en charge l’authentification pour Azure SQL Database, Azure Synapse Analytics et Azure SQL Managed Instance en acquérant des jetons d’accès par le biais d’une identité managée. Pour utiliser cette authentification, spécifiez Active Directory Managed Identity ou Active Directory MSI dans la chaîne de connexion et aucun mot de passe n’est requis. Vous ne pouvez pas définir la propriété Credential de SqlConnection dans ce mode.

Pour une identité managée affectée par l’utilisateur, l’ID client de l’identité managée doit être fourni lors de l’utilisation de Microsoft.Data.SqlClient version 3.0 ou ultérieure. Si vous utilisez Microsoft.Data.SqlClient version 2.1, l’ID d’objet de l’identité managée doit être fourni.

L’exemple suivant montre comment utiliser l’authentification Active Directory Managed Identity avec une identité gérée attribuée par le système.

// 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’exemple suivant illustre l’Active Directory Managed Identityauthentification avec une identité managée affectée par l’utilisateur avec Microsoft.Data.SqlClient version 3.0 et ultérieures.

// 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’exemple suivant illustre l’Active Directory Managed Identityauthentification avec une identité managée affectée par l’utilisateur avec Microsoft.Data.SqlClient version 2.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();
}

Utilisation de l’authentification par défaut

Disponible à partir de la version 3.0, ce mode d'authentification élargit les possibilités d'authentification des utilisateurs. Ce mode étend les solutions de connexion à l’environnement client, Visual Studio Code, Visual Studio, Azure CLI, etc.

Avec ce mode d’authentification, le pilote acquiert un jeton en transmettant « DefaultAzureCredential » à partir de la bibliothèque Azure Identity pour obtenir un jeton d’accès. Ce mode tente d’utiliser un jeu de types d’identifiants pour obtenir un jeton d’accès dans l’ordre. Le jeu d'identifiants varie en fonction de la version de la bibliothèque Azure Identity utilisée. Les différences entre les versions sont indiquées dans la liste. Pour les comportements spécifiques à la version d'Azure Identity, consultez la documentation de l'API Azure.Identity.

  • EnvironmentCredential
    • Active l’authentification avec Microsoft Entra ID à l’aide du client et du secret, ou du nom d’utilisateur et du mot de passe, des détails configurés dans les variables d’environnement suivantes : AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (Plus d’informations)
  • WorkloadIdentityCredential
    • Active l’authentification de l’ID de charge de travail Microsoft Entra sur Kubernetes et d’autres hôtes prenant en charge l’identité de charge de travail. Pour plus d’informations, consultez identités de charge de travail Microsoft Entra. Disponible à partir d’Azure Identity version 1.10 et de Microsoft.Data.SqlClient 5.1.4.
  • ManagedIdentityCredential
    • Tente l’authentification avec Microsoft Entra ID à l’aide d’une identité managée qui est affectée à l’environnement de déploiement. « ID client » d’« identité managée affectée par l’utilisateur » est lu à partir de la propriété de connexion « ID d’utilisateur » .
  • SharedTokenCacheCredential
    • Procède à l’authentification à l’aide de jetons dans le cache local partagé entre les applications Microsoft.
  • VisualStudioCredential
    • Assure l’authentification avec Microsoft Entra ID à l’aide de données provenant de Visual Studio
  • VisualStudioCodeCredential
    • Active l’authentification avec Microsoft Entra ID à l’aide de données de Visual Studio Code.
  • AzurePowerShellCredential
    • Permet l'authentification avec Microsoft Entra ID en utilisant Azure PowerShell. Disponible à partir d’Azure Identity version 1.6 et Microsoft.Data.SqlClient 5.0.
  • AzureCliCredential
    • Active l’authentification avec Microsoft Entra ID à l’aide d’Azure CLI pour obtenir un jeton d’accès.
  • AzureDeveloperCliCredential
    • Active l’authentification de Microsoft Entra ID à l’aide d’Azure Developer CLI pour obtenir un jeton d’accès. Disponible à partir d’Azure Identity version 1.10 et de Microsoft.Data.SqlClient 5.1.4.

Remarque

InteractiveBrowserCredential est désactivé dans l’implémentation de pilote « Active Directory par défaut » et « Active Directory interactive » est la seule option disponible pour acquérir un jeton à l’aide de l’authentification MFA/interactive.

Aucune autre option de personnalisation n’est disponible pour le moment.

L’exemple suivant montre comment utiliser l’authentification Active Directory par défaut.

// 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();
}

Utilisation de l'authentification des identités de charge de travail

Disponible à partir de la version 5.2, comme avec les identités managées, le mode d'authentification des identités de charge de travail utilise la valeur du paramètre identifiant utilisateur dans la chaîne de connexion pour son ID client s'il est spécifié. Mais, contrairement à l'identité managée, WorkloadIdentityCredentialOptions définit par défaut sa valeur à partir de variables d'environnement : AZURE_TENANT_ID, AZURE_CLIENT_ID et AZURE_FEDERATED_TOKEN_FILE. Toutefois, seul l'ID client peut être remplacé par le chaîne de connexion.

L'exemple suivant illustre l'authentification Active Directory Workload Identity avec une identité managée affectée par l'utilisateur avec Microsoft.Data.SqlClient version 5.2 et ultérieures.

// 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();
}

Personnalisation de l’authentification Microsoft Entra

Outre l’utilisation de l’authentification Microsoft Entra intégrée au pilote, Microsoft.Data.SqlClient 2.1.0 et les versions ultérieures fournissent aux applications la possibilité de personnaliser l’authentification Microsoft Entra. La personnalisation est basée sur la classe ActiveDirectoryAuthenticationProvider, qui est dérivée de la classe abstraite SqlAuthenticationProvider.

Pendant l’authentification Microsoft Entra, l’application cliente peut définir sa propre classe ActiveDirectoryAuthenticationProvider par l’une des opérations suivantes :

  • Utilisation d’une méthode de rappel personnalisée.
  • Transmission d’un ID client d’application vers la bibliothèque MSAL via le pilote SqlClient pour l’extraction des jetons d’accès.

L’exemple suivant montre comment utiliser un rappel personnalisé lorsque l’authentification Active Directory Device Code Flow est en cours d’utilisation.

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);
        }
    }
}

Avec une classe de ActiveDirectoryAuthenticationProvider personnalisée, un ID client d’application définie par l’utilisateur peut être transmis à SqlClient lorsqu’un mode d’authentification Microsoft Entra pris en charge est en cours d’utilisation. Les modes d’authentification Microsoft Entra pris en charge incluent Active Directory Password, Active Directory Integrated, Active Directory Interactive, Active Directory Service Principal et Active Directory Device Code Flow.

L’ID client de l’application est également configurable via SqlAuthenticationProviderConfigurationSection ou SqlClientAuthenticationProviderConfigurationSection. La propriété de configuration applicationClientId s’applique à .NET Framework 4.6+ et .NET Core 2.1+.

L’extrait de code suivant est un exemple d’utilisation d’une classe de ActiveDirectoryAuthenticationProvider personnalisée avec un ID client d’application définie par l’utilisateur lorsque l’authentification Active Directory Interactive est en cours d’utilisation.

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’exemple suivant montre comment configurer un ID client d’application à l’aide d’une section de configuration.

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

Support d’un fournisseur d’authentification SQL personnalisé

En raison d’une plus grande flexibilité, l’application cliente peut également utiliser son propre fournisseur pour l’authentification Microsoft Entra au lieu d’utiliser la classe ActiveDirectoryAuthenticationProvider. Le fournisseur d’authentification personnalisé doit être une sous-classe de SqlAuthenticationProvider avec des méthodes substituées. Il doit ensuite inscrire le fournisseur personnalisé, en remplaçant une ou plusieurs des méthodes d’authentification Active Directory* existantes.

L’exemple suivant montre comment utiliser un nouveau fournisseur d’authentification pour l’authentification 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!");
            }
        }
    }
}

Outre l’amélioration de l’expérience d’authentification Active Directory Interactive, Microsoft.Data.SqlClient 2.1.0 et versions ultérieures fournissent les API suivantes pour les applications clientes afin de personnaliser l’authentification interactive et l’authentification du flux de code de l’appareil.

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();
}

Voir aussi