Herstellen einer Verbindung mit Azure SQL mit Microsoft Entra-Authentifizierung und SqlClient

Gilt für: .NET Framework .NET .NET Standard

Herunterladen von ADO.NET

In diesem Artikel wird beschrieben, wie eine Verbindung mit Azure SQL-Datenquellen hergestellt werden kann, indem die Microsoft Entra-Authentifizierung (Azure AD) von einer .NET-Anwendung mit SqlClient verwendet wird.

Hinweis

Während Microsoft Entra-ID der neue Name für Azure Active Directory (Azure AD) ist, bleibt Azure AD in einigen fest kodierten Elementen wie Benutzeroberfläche-Feldern, Verbindungsanbietern, Fehlercodes und Cmdlets erhalten, um Störungen in bestehenden Umgebungen zu vermeiden. In diesem Artikel sind die beiden Namen austauschbar.

Übersicht

Die Microsoft Entra-Authentifizierung nutzt Identitäten in Microsoft Entra ID für den Zugriff auf Datenquellen wie Azure SQL-Datenbank, Azure SQL Managed Instance und Azure Synapse Analytics. Der Namespace Microsoft.Data.SqlClient ermöglicht es Clientanwendungen, Microsoft Entra-Anmeldedaten in verschiedenen Authentifizierungsmodi anzugeben, wenn sie eine Verbindung mit Azure SQL-Datenbank und Azure SQL Managed Instance herstellen. Um die Microsoft Entra-Authentifizierung mit Azure SQL zu verwenden, müssen Sie die Microsoft Entra-Authentifizierung mit Azure SQL konfigurieren und verwalten.

Wenn Sie die Verbindungseigenschaft Authentication in der Verbindungszeichenfolge festlegen, kann der Client entsprechend dem angegebenen Wert einen bevorzugten Microsoft Entra-Authentifizierungsmodus wählen:

  • Die früheste Version von Microsoft.Data.SqlClient unterstützt für .NET Framework, .NET Core und .NET Standard Active Directory Password. Außerdem werden für .NET Framework unterstützt die Authentifizierungstypen Active Directory Integrated und Active Directory Interactive.

  • Ab Microsoft.Data.SqlClient 2.0.0 wird die Unterstützung der Authentifizierungstypen Active Directory Integrated und Active Directory Interactive auf .NET Framework, .NET Core und .NET Standard ausgedehnt.

    SqlClient 2.0.0 bietet nun auch den neuen Authentifizierungsmodus Active Directory Service Principal. Dieser nutzt zur Authentifizierung die Client-ID und das Geheimnis einer Dienstprinzipalidentität.

  • Microsoft.Data.SqlClient 2.1.0 bietet weitere Authentifizierungsmodi, einschließlich Active Directory Device Code Flow und Active Directory Managed Identity (auch Active Directory MSI genannt). Diese neuen Modi ermöglichen der Anwendung das Abrufen eines Zugriffstokens, um eine Verbindung mit dem Server herzustellen.

Informationen zur Microsoft Entra-Authentifizierung, die über die Beschreibungen in den folgenden Abschnitten hinausgehen, finden Sie unter Verwenden der Microsoft Entra-Authentifizierung.

Einrichtung der Microsoft Entra-Authentifizierung

Wenn die Anwendung eine Verbindung mit Azure SQL-Datenquellen unter Verwendung der Microsoft Entra-Authentifizierung herstellt, muss sie einen gültigen Authentifizierungsmodus bieten. In der folgenden Tabelle sind die unterstützten Authentifizierungsmodi aufgeführt. Die Anwendung gibt einen Modus mithilfe der Verbindungseigenschaft Authentication in der Verbindungszeichenfolge an.

Wert BESCHREIBUNG Version von Microsoft.Data.SqlClient
Active Directory Password Authentifizieren mit dem Benutzernamen und Kennwort einer Microsoft Entra-Identität Ab 1.0
Active Directory Integrated Authentifizierung mit einer Microsoft Entra-Identität unter Verwendung der integrierten Windows-Authentifizierung (IWA) Ab 2.0.01
Active Directory Interactive Authentifizierung mit einer Microsoft Entra-Identität unter Verwendung der interaktiven Authentifizierung Ab 2.0.01
Active Directory Service Principal Authentifizieren mit einem Microsoft Entra-Dienstprinzipal mithilfe der Client-ID und des geheimen Schlüssels Ab 2.0.0
Active Directory Device Code Flow Authentifizierung mit einer Microsoft Entra-Identität unter Verwendung des Modus Gerätecodeflow Ab 2.1.0
Active Directory Managed Identity,
Active Directory MSI
Authentifizierung mit einer systemseitig oder benutzerseitig zugewiesenen verwalteten Microsoft Entra-Identität. Ab 2.1.0
Active Directory Default Authentifizierung mit einer Microsoft Entra-Identität unter Verwendung von kennwortlosen und nicht interaktiven Mechanismen wie mit verwalteten Identitäten, Visual Studio Code, Visual Studio, der Azure CLI usw. 3.0.0 und höher
Active Directory-Workloadidentität Authentifizieren Sie sich mit einer Microsoft Entra-Identität mithilfe einer vom Verbund benutzerseitig zugewiesenen verwalteten Identität, um eine Verbindung mit SQL-Datenbank aus Azure-Clientumgebungen herzustellen, die Unterstützung für Workload Identity aktiviert haben. 5.2.0+

1 Vor Microsoft.Data.SqlClient 2.0.0 wurden die Authentifizierungsmodi Active Directory Integrated und Active Directory Interactive nur für .NET Framework unterstützt.

Verwendung der Kennwortauthentifizierung

Der Authentifizierungsmodus Active Directory Password unterstützt die Authentifizierung bei Azure-Datenquellen mit Microsoft Entra ID für native Benutzer oder Verbundbenutzer von Microsoft Entra. Bei Wahl dieses Modus müssen Benutzeranmeldeinformationen in der Verbindungszeichenfolge angegeben werden. Das folgende Beispiel zeigt, wie die Authentifizierung Active Directory Password verwendet wird.

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

Nutzung der integrierten Authentifizierung

Um den Authentifizierungsmodus Active Directory Integrated zu verwenden, müssen Sie über eine lokale Active Directory Instanz verfügen, die mit Microsoft Entra ID in der Cloud verknüpft ist. Einen Verbund können Sie beispielsweise mithilfe von Active Directory-Verbunddienste (AD FS) einrichten.

Wenn Sie bei einem in die Domäne eingebundenen Computer angemeldet sind, können Sie in diesem Modus auf Azure SQL-Datenquellen zugreifen, ohne zur Eingabe von Anmeldeinformationen aufgefordert zu werden. In der Verbindungszeichenfolge für .NET Framework-Anwendungen können Sie nicht den Benutzernamen und das Kennwort angeben. Für .NET Core- und .NET Standard-Anwendungen ist der Benutzername in der Verbindungszeichenfolge optional. Die Credential-Eigenschaft von SqlConnection kann in diesem Modus nicht festgelegt werden.

Der folgende Codeausschnitt ist ein Beispiel der Verwendung der Active Directory Integrated-Authentifizierung.

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

Verwendung der interaktiven Authentifizierung

Der Authentifizierungsmodus Active Directory Interactive unterstützt zum Herstellen einer Verbindung mit Azure SQL-Datenquellen eine mehrstufige Authentifizierungstechnologie. Wenn Sie diesen Authentifizierungsmodus in der Verbindungszeichenfolge angeben, wird ein Bildschirm zur Authentifizierung bei Azure angezeigt, auf dem der Benutzer zur Eingabe gültiger Anmeldeinformationen aufgefordert wird. Sie können das Kennwort nicht in der Verbindungszeichenfolge eingeben.

Die Credential-Eigenschaft von SqlConnection kann in diesem Modus nicht festgelegt werden. Ab Microsoft.Daten.SqlClient 2.0.0 ist der Benutzername in der Verbindungszeichenfolge zulässig, sofern Sie sich im interaktiven Modus befinden.

Das folgende Beispiel zeigt, wie die Authentifizierung Active Directory Interactive verwendet wird.

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

Verwenden der Dienstprinzipalauthentifizierung

Im Authentifizierungsmodus Active Directory Service Principal kann die Clientanwendung eine Verbindung mit Azure-SQL-Datenquellen herstellen, und zwar durch Angabe der Client-ID und des Geheimnisses einer Dienstprinzipalidentität. Die Dienstprinzipalauthentifizierung umfasst Folgendes:

  1. Einrichten einer App-Registrierung mit einem Geheimnis
  2. Erteilen von Berechtigungen für die App in der Azure SQL-Datenbankinstanz
  3. Herstellen der Verbindung mit den richtigen Anmeldeinformationen

Das folgende Beispiel zeigt, wie die Authentifizierung Active Directory Service Principal verwendet wird.

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

Verwendung der Authentifizierung mit Gerätecodeflow

Mithilfe der Microsoft Authentication Library für .NET (MSAL.NET) ermöglicht die Active Directory Device Code Flow-Authentifizierung, dass die Clientanwendung mit Azure SQL-Datenquellen über Geräte und Betriebssysteme, die keinen interaktiven Webbrowser haben, verbunden wird. Die interaktive Authentifizierung erfolgt auf einem anderen Gerät. Weitere Informationen zur Gerätecodeflow-Authentifizierung finden Sie unter OAuth 2.0-Gerätecodeflow.

Bei Wahl dieses Modus können Sie nicht die Credential-Eigenschaft von SqlConnection festlegen. Außerdem dürfen Benutzername und Kennwort nicht in der Verbindungszeichenfolge angegeben werden.

Der folgende Codeausschnitt ist ein Beispiel der Verwendung der Active Directory Device Code Flow-Authentifizierung.

Hinweis

Das Timeout für Active Directory Device Code Flow wird standardmäßig auf die Einstellung Connect Timeout der Verbindung festgelegt. Stellen Sie sicher, dass Sie einen Wert für Connect Timeout angeben, der genügend Zeit zum Durchlaufen des Authentifizierungsprozesses für den Gerätecodeflow bietet.

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

Verwendung der Authentifizierung mit verwalteter Identität

Die Authentifizierung mit verwalteten Identitäten für Azure-Ressourcen ist die empfohlene Authentifizierungsmethode für den programmgesteuerten Zugriff auf SQL. Eine Clientanwendung kann die vom System zugewiesene oder vom Benutzer zugewiesene verwaltete Identität einer Ressource verwenden, um sich bei SQL mit Microsoft Entra D zu authentifizieren, indem die Identität bereitgestellt und zum Abrufen von Zugriffstokens verwendet wird. Durch diese Methode entfällt die Verwaltung von Anmeldedaten und Geheimnissen, was die Zugriffsverwaltung vereinfacht.

Es gibt zwei Arten von verwalteten Identitäten:

  • Die systemseitig zugewiesene verwaltete Identität wird als Teil einer Azure-Ressource (z. B. Ihrer SQL Managed Instance oder dem logischen Server) erstellt und teilt den Lebenszyklus dieser Ressource. Systemseitig zugewiesene Identitäten können nur einer einzigen Azure-Ressource zugeordnet werden.
  • Eine benutzerseitig zugewiesene verwaltete Identität wird als eigenständige Azure-Ressource erstellt und kann einer oder mehreren Instanzen eines Azure-Diensts zugewiesen werden.

Weitere Informationen zu verwalteten Identitäten finden Sie unter Was sind verwaltete Identitäten für Azure-Ressourcen?.

Ab Microsoft.Daten.SqlClient 2.1.0 unterstützt der Treiber die Authentifizierung bei Azure SQL-Datenbank, Azure Synapse Analytics und Azure SQL Managed Instance durch den Bezug von Zugriffstoken über eine verwaltete Identität. Für diese Authentifizierung müssen Sie in der Verbindungszeichenfolge entweder Active Directory Managed Identity oder Active Directory MSI angeben, wobei kein Kennwort erforderlich ist. Die Credential-Eigenschaft von SqlConnection kann in diesem Modus auch nicht festgelegt werden.

Bei einer benutzerseitig zugewiesenen verwalteten Identität muss die Client-ID der verwalteten Identität angegeben werden, wenn Microsoft.Data.SqlClient ab Version 3.0 verwendet wird. Wenn Microsoft.Data.SqlClient ab Version 2.1 verwendet wird, muss die Objekt-ID der verwalteten Identität angegeben werden.

Im folgenden Beispiel wird gezeigt, wie die Active Directory Managed Identity-Authentifizierung mit einer systemseitig zugewiesenen verwalteten Identität verwendet wird.

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

Im folgenden Beispiel wird die Active Directory Managed Identity-Authentifizierung mit einer benutzerseitig zugewiesenen verwalteten Identität bei Microsoft.Data.SqlClient ab Version 3.0 veranschaulicht.

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

Im folgenden Beispiel wird die Active Directory Managed Identity-Authentifizierung mit einer benutzerseitig zugewiesenen verwalteten Identität bei Microsoft.Data.SqlClient 2.1 veranschaulicht.

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

Verwendung der Standardauthentifizierung

Ab Version 3.0 erweitert dieser Authentifizierungsmodus die Möglichkeiten der Benutzerauthentifizierung. Dieser Modus erweitert die Anmeldelösungen auf die Clientumgebung, Visual Studio Code, Visual Studio, die Azure CLI usw.

Bei diesem Authentifizierungsmodus erhält der Treiber ein Token, indem er DefaultAzureCredential aus der Azure Identity-Bibliothek übergibt, um ein Zugriffstoken zu erhalten. In diesem Modus wird versucht, mit einem Satz von Anmeldatentypen ein Zugriffstoken abzurufen. Je nach verwendeter Version der Azure Identity-Bibliothek ist der Anmeldedatensatz unterschiedlich. Versionsspezifische Unterschiede sind in der Liste aufgeführt. Informationen zum spezifischen Verhalten je nach Azure Identity-Version finden Sie in den Dokumenten zur Azure.Identity-API.

  • EnvironmentCredential
    • Ermöglicht die Authentifizierung bei Microsoft Entra ID mit Client und Geheimnis oder mit Benutzername und Kennwort. Dabei müssen folgende Umgebungsvariablen konfiguriert werden: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (Weitere Informationen)
  • WorkloadIdentityCredential
    • Ermöglicht die Microsoft Entra Workload ID-Authentifizierung auf Kubernetes und anderen Hosts, die die Workload Identity unterstützen. Weitere Informationen finden Sie unter Microsoft Entra Workload ID. Verfügbar ab Azure Identity-Version 1.10 und Microsoft.Data.SqlClient 5.1.4.
  • ManagedIdentityCredential
    • Authentifizierung bei Microsoft Entra ID mit einer verwalteten Identität, die der Bereitstellungsumgebung zugewiesen ist. „Client-ID“ und „Benutzerseitig zugewiesene verwaltete Identität“ werden aus der Verbindungseigenschaft „Benutzer-ID“ ausgelesen.
  • SharedTokenCacheCredential
    • Authentifizierung mit Token in dem von Microsoft-Anwendungen gemeinsam genutzten lokalen Cache.
  • VisualStudioCredential
    • Ermöglicht die Authentifizierung mit Microsoft Entra ID anhand von Daten aus Visual Studio
  • VisualStudioCodeCredential
    • Ermöglicht die Authentifizierung mit Microsoft Entra ID anhand von Daten aus Visual Studio Code.
  • AzurePowerShellCredential
    • Ermöglicht die Authentifizierung bei Microsoft Entra ID über Azure PowerShell. Verfügbar ab Azure Identity-Version 1.6 und Microsoft.Data.SqlClient 5.0.
  • AzureCliCredential
    • Ermöglicht die Authentifizierung mit Microsoft Entra ID mithilfe der Azure CLI, um ein Zugriffstoken abzurufen.
  • AzureDeveloperCliCredential
    • Ermöglicht die Authentifizierung mit Microsoft Entra ID über die Azure Developer CLI zum Abrufen eines Zugriffstokens. Verfügbar ab Azure Identity-Version 1.10 und Microsoft.Data.SqlClient 5.1.4.

Hinweis

InteractiveBrowserCredential ist in der Treiberimplementierung von „Active Directory Default“ deaktiviert. „Active Directory Interactive“ ist die einzige verfügbare Option zum Abrufen eines Tokens mithilfe der MFA/interaktiven Authentifizierung.

Weitere Anpassungsoptionen sind derzeit nicht verfügbar.

Im folgenden Beispiel wird die Verwendung der Active Directory Default-Authentifizierung veranschaulicht.

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

Verwenden der Workload Identity Authentication

Ab Version 5.2 verfügbar, z. B. bei verwalteten Identitäten, verwendet der Workload-Identitäts-Authentifizierungsmodus den Wert des Parameters "Benutzer-ID" im Verbindungszeichenfolge für die Client-ID, sofern angegeben. Im Gegensatz zu verwalteter Identität verwendet WorkloadIdentityCredentialOptions den Wert jedoch aus Umgebungsvariablen: AZURE_TENANT_ID, AZURE_CLIENT_ID und AZURE_FEDERATED_TOKEN_FILE. Allerdings kann nur die Client-ID von der Verbindungszeichenfolge außer Kraft gesetzt werden.

Im folgenden Beispiel wird die Active Directory Workload Identity-Authentifizierung mit einer benutzerseitig zugewiesenen verwalteten Identität bei Microsoft.Data.SqlClient v5.2 und höher veranschaulicht.

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

Anpassen der Microsoft Entra-Authentifizierung

Neben der Verwendung der in den Treiber integrierten Microsoft Entra-Authentifizierung wird ab Microsoft.Data.SqlClient 2.1.0 Anwendungen die Möglichkeit geboten, die Microsoft Entra-Authentifizierung anzupassen. Die Anpassung basiert auf der ActiveDirectoryAuthenticationProvider-Klasse, die der abstrakten SqlAuthenticationProvider-Klasse abgeleitet ist.

Während der Microsoft Entra-Authentifizierung kann die Clientanwendung ihre eigene ActiveDirectoryAuthenticationProvider-Klasse wie folgt definieren:

  • Durch Verwenden einer angepassten Rückrufmethode
  • Durch Übergeben einer Anwendungsclient-ID an die MSAL-Bibliothek über den SqlClient-Treiber zum Abrufen von Zugriffstoken

Das folgende Beispiel zeigt, wie bei Verwendung der Active Directory Device Code Flow-Authentifizierung ein benutzerdefinierter Rückruf erfolgt.

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

Mit einer angepassten ActiveDirectoryAuthenticationProvider-Klasse kann eine benutzerdefinierte Clientanwendungs-ID an SqlClient übergeben werden, sofern ein unterstützter Microsoft Entra-Authentifizierungsmodus eingesetzt wird. Zu den unterstützten Microsoft Entra-Authentifizierungsmodi gehören Active Directory Password, Active Directory Integrated, Active Directory Interactive, Active Directory Service Principal und Active Directory Device Code Flow.

Die Anwendungsclient-ID lässt sich auch über SqlAuthenticationProviderConfigurationSection oder SqlClientAuthenticationProviderConfigurationSection konfigurieren. Die Konfigurationseigenschaft applicationClientId gilt für .NET Framework ab  4.6 und .Net Core ab 2.1.

Der folgende Codeausschnitt ist ein Beispiel für die Verwendung einer benutzerdefinierten ActiveDirectoryAuthenticationProvider-Klasse mit einer benutzerdefinierten Clientanwendungs-ID, wenn die Active Directory Interactive-Authentifizierung verwendet wird.

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

Das folgende Beispiel zeigt, wie die Client-ID einer Anwendung in einem Konfigurationsabschnitt festgelegt wird.

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

Unterstützung eines benutzerdefinierten SQL-Authentifizierungsanbieters

Angesichts der größeren Flexibilität kann die Clientanwendung auch ihren eigenen Anbieter für die Microsoft Entra-Authentifizierung anstelle der ActiveDirectoryAuthenticationProvider-Klasse verwenden. Der benutzerdefinierte Authentifizierungsanbieter muss eine Unterklasse von SqlAuthenticationProvider mit überschriebenen Methoden sein. Anschließend muss der benutzerdefinierte Anbieter registriert und dadurch mindestens eine der vorhandenen Active Directory*-Authentifizierungsmethoden überschrieben werden.

Das folgende Beispiel zeigt, wie zur Active Directory Device Code Flow-Authentifizierung ein neuer Authentifizierungsanbieter verwendet wird.

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

Zusätzlich zur verbesserten Active Directory Interactive-Authentifizierung werden ab Microsoft.Data.SqlClient 2.1.0 die folgenden APIs für Clientanwendungen bereitgestellt, um die interaktive und Gerätecodeflow-Authentifizierung anzupassen.

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

Weitere Informationen