Delen via


Verbinding maken met Azure SQL met Microsoft Entra-verificatie en SqlClient

van toepassing op: .NET Framework .NET .NET Standard

ADO.NET downloaden

In dit artikel wordt beschreven hoe u verbinding maakt met Azure SQL-gegevensbronnen met behulp van Microsoft Entra-verificatie vanuit een .NET-toepassing met SqlClient.

Notitie

Hoewel Microsoft Entra ID de nieuwe naam is voor Azure Active Directory (Azure AD), blijft Azure AD, om verstoring van bestaande omgevingen te voorkomen, nog steeds bestaan in sommige hardcoded elementen, zoals UI-velden, verbindingsproviders, foutcodes en cmdlets. In dit artikel zijn de twee namen uitwisselbaar.

Overzicht

Microsoft Entra-verificatie maakt gebruik van identiteiten in Microsoft Entra ID voor toegang tot gegevensbronnen zoals Azure SQL Database, Azure SQL Managed Instance en Azure Synapse Analytics. Met de Microsoft.Data.SqlClient-naamruimte kunnen clienttoepasselingen de Microsoft Entra-referenties opgeven in verschillende verificatiemodes wanneer ze verbinding maken met Azure SQL Database en Azure SQL Managed Instance. Als u Microsoft Entra-verificatie met Azure SQL wilt gebruiken, moet u Microsoft Entra-verificatie configureren en beheren met Azure SQL.

Wanneer u de eigenschap Authentication verbinding in de verbindingsreeks instelt, kan de client een voorkeursverificatiemodus van Microsoft Entra kiezen op basis van de opgegeven waarde:

  • De vroegste Microsoft.Data.SqlClient-versie ondersteunt Active Directory Password voor .NET Framework, .NET Core en .NET Standard. Het biedt ook ondersteuning voor Active Directory Integrated-verificatie en Active Directory Interactive-verificatie voor .NET Framework.

  • Vanaf Microsoft.Data.SqlClient 2.0.0 wordt ondersteuning voor Active Directory Integrated-verificatie en Active Directory Interactive-verificatie uitgebreid in .NET Framework, .NET Core en .NET Standard.

    Er wordt ook een nieuwe Active Directory Service Principal-verificatiemodus toegevoegd in SqlClient 2.0.0. Het maakt gebruik van de client-ID en het geheim van een service-principal-identiteit voor authenticatie.

  • Er worden meer verificatiemodi toegevoegd in Microsoft.Data.SqlClient 2.1.0, waaronder Active Directory Device Code Flow en Active Directory Managed Identity (ook wel Active Directory MSIgenoemd). Met deze nieuwe modi kan de toepassing een toegangstoken verkrijgen om verbinding te maken met de server.

Voor meer informatie over Microsoft Entra-verificatie dan wat in de volgende secties wordt beschreven, zie Microsoft Entra-verificatie gebruiken.

Microsoft Entra-verificatie instellen

Wanneer de toepassing verbinding maakt met Azure SQL-gegevensbronnen met behulp van Microsoft Entra-verificatie, moet deze een geldige verificatiemodus opgeven. De volgende tabel bevat de ondersteunde verificatiemodi. De toepassing geeft een modus op met behulp van de Authentication verbindingseigenschap in de verbindingsreeks.

Waarde Beschrijving Microsoft.Data.SqlClient-versie
Active Directory-wachtwoord Verifiëren met de gebruikersnaam en het wachtwoord van een Microsoft Entra-identiteit 1.0+
Active Directory Geïntegreerd Authenticeren met een Microsoft Entra-identiteit via geïntegreerde Windows-verificatie (IWA) 2.0.0+1
Active Directory Interactief Verifiëren met een Microsoft Entra-identiteit met behulp van interactieve verificatie 2.0.0+1
Active Directory-serviceprincipal Authenticeren met een Microsoft Entra-service-principal, gebruikmakend van het client-id en de sleutel 2.0.0+
Active Directory-apparaatcodestroom Verifiëren met een Microsoft Entra-identiteit met behulp van de apparaatcodestroommodus 2.1.0+
Active Directory-beheerde identiteit
Active Directory MSI
Verifiëren met een door het Microsoft Entra-systeem toegewezen of door de gebruiker toegewezen beheerde identiteit 2.1.0+
Active Directory standaardinstelling Verifieer met een Microsoft Entra-identiteit met behulp van wachtwoordloze en niet-interactieve mechanismen, waaronder beheerde identiteiten, Visual Studio Code, Visual Studio, Azure CLI, enzovoort. 3.0.0+
Active Directory workload-identiteit Verifieer met een Microsoft Entra-identiteit met behulp van een federatieve door de gebruiker toegewezen beheerde identiteit om verbinding te maken met SQL Database vanuit Azure-clientomgevingen die zijn ingeschakeld voor workloadidentiteit. 5.2.0+

1 Vóór Microsoft.Data.SqlClient 2.0.0, Active Directory Integrateden Active Directory Interactive verificatiemodi worden alleen ondersteund in .NET Framework.

Wachtwoordverificatie gebruiken

Active Directory Password verificatiemodus ondersteunt verificatie bij Azure-gegevensbronnen met Microsoft Entra-id voor systeemeigen of federatieve Microsoft Entra-gebruikers. Wanneer u deze modus gebruikt, moeten gebruikersreferenties worden opgegeven in de verbindingsreeks. In het volgende voorbeeld ziet u hoe u Active Directory Password verificatie gebruikt.

// 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=<password>";

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

Geïntegreerde verificatie gebruiken

Als u Active Directory Integrated verificatiemodus wilt gebruiken, moet u een on-premises Active Directory-exemplaar hebben dat is toegevoegd aan aan Microsoft Entra ID in de cloud. U kunt bijvoorbeeld federeren met behulp van Active Directory Federation Services (AD FS).

Wanneer u bent aangemeld bij een computer die lid is van een domein, hebt u toegang tot Azure SQL-gegevensbronnen zonder te worden gevraagd om referenties met deze modus. U kunt geen gebruikersnaam en wachtwoord opgeven in de verbindingsreeks voor .NET Framework-toepassingen. Gebruikersnaam is optioneel in de verbindingsreeks voor .NET Core- en .NET Standard-toepassingen. U kunt de eigenschap Credential van SqlConnection niet instellen in deze modus.

Het volgende codefragment is een voorbeeld van wanneer Active Directory Integrated verificatie wordt gebruikt.

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

Interactieve verificatie gebruiken

Active Directory Interactive-verificatie ondersteunt meervoudige verificatietechnologie om verbinding te maken met Azure SQL-gegevensbronnen. Als u deze verificatiemodus in de verbindingsreeks opgeeft, wordt er een Azure-verificatiescherm weergegeven en wordt de gebruiker gevraagd geldige referenties in te voeren. U kunt het wachtwoord niet opgeven in de verbindingsreeks.

U kunt de eigenschap Credential van SqlConnection niet instellen in deze modus. Met Microsoft.Data.SqlClient 2.0.0 en hoger is gebruikersnaam toegestaan in de verbindingsreeks wanneer u zich in de interactieve modus bevindt.

In het volgende voorbeeld ziet u hoe u Active Directory Interactive verificatie gebruikt.

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

Gebruik maken van service-principal verificatie

In Active Directory Service Principal verificatiemodus kan de clienttoepassing verbinding maken met Azure SQL-gegevensbronnen door de client-id en het geheim van een service-principal-identiteit op te geven. Verificatie van service-principal-authenticatie omvat:

  1. Een app-registratie met een geheim instellen.
  2. Machtigingen verlenen aan de app in het Azure SQL Database-exemplaar.
  3. Verbinding maken met de juiste inloggegevens.

In het volgende voorbeeld ziet u hoe u Active Directory Service Principal verificatie gebruikt.

// 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=<password>";

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

Het gebruik van apparaatcode-authenticatie.

Met Microsoft Authentication Library voor .NET (MSAL.NET) kan de clienttoepassing met Active Directory Device Code Flow verificatie verbinding maken met Azure SQL-gegevensbronnen vanaf apparaten en besturingssystemen die geen interactieve webbrowser hebben. Interactieve verificatie wordt uitgevoerd op een ander apparaat. Zie voor meer informatie over apparaatcodestroom-authenticatie van OAuth 2.0.

Wanneer deze modus wordt gebruikt, kunt u de eigenschap Credential van SqlConnectionniet instellen. De gebruikersnaam en het wachtwoord mogen ook niet worden opgegeven in de verbindingsreeks.

Het volgende codefragment is een voorbeeld van het gebruik van Active Directory Device Code Flow verificatie.

Notitie

De time-out voor Active Directory Device Code Flow is standaard ingesteld op de Connect Timeout-instelling van de verbinding. Zorg ervoor dat u een Connect Timeout opgeeft die voldoende tijd biedt om het authenticatieproces van de apparaatcodeflow uit te voeren.

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

Het gebruiken van authenticatie met beheerde identiteit

Verificatie met beheerde identiteiten voor Azure-resources is de aanbevolen verificatiemethode voor programmatische toegang tot SQL. Een clienttoepassing kan de door het systeem toegewezen of door de gebruiker toegewezen beheerde identiteit van een resource gebruiken om te verifiëren bij SQL met Microsoft Entra-id, door de identiteit op te geven en deze te gebruiken om toegangstokens te verkrijgen. Deze methode elimineert de noodzaak om referenties en geheimen te beheren en kan toegangsbeheer vereenvoudigen.

Er zijn twee typen beheerde identiteiten:

  • door het systeem toegewezen beheerde identiteit wordt gemaakt als onderdeel van een Azure-resource (zoals uw beheerde SQL-exemplaar of de logische server) en deelt de levenscyclus van die resource. Door het systeem toegewezen identiteiten kunnen alleen worden gekoppeld aan één Azure-resource.
  • door de gebruiker toegewezen beheerde identiteit wordt gemaakt als een zelfstandige Azure-resource. Deze kan worden toegewezen aan een of meer exemplaren van een Azure-service.

Zie Over beheerde identiteiten voor Azure-resourcesvoor meer informatie over beheerde identiteiten.

Sinds Microsoft.Data.SqlClient versie 2.1.0 ondersteunt het stuurprogramma de verificatie voor Azure SQL Database, Azure Synapse Analytics en Azure SQL Managed Instance door toegangstokens te verkrijgen via een beheerde identiteit. Als u deze verificatie wilt gebruiken, geeft u Active Directory Managed Identity of Active Directory MSI op in de verbindingsreeks en is er geen wachtwoord vereist. U kunt de eigenschap Credential van SqlConnection ook niet instellen in deze modus.

Voor een door de gebruiker toegewezen beheerde identiteit moet de client-id van de beheerde identiteit worden opgegeven wanneer u Microsoft.Data.SqlClient v3.0 of hoger gebruikt. Als u Microsoft.Data.SqlClient v2.1 gebruikt, moet de object-id van de beheerde identiteit worden opgegeven.

In het volgende voorbeeld ziet u hoe u Active Directory Managed Identity verificatie gebruikt met een door het systeem toegewezen beheerde identiteit.

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

In het volgende voorbeeld ziet u Active Directory Managed Identity verificatie met een door de gebruiker toegewezen beheerde identiteit met Microsoft.Data.SqlClient v3.0 en.

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

In het volgende voorbeeld ziet u Active Directory Managed Identity authenticatie met een door gebruiker toegewezen beheerde identiteit met 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();
}

Standaardverificatie gebruiken

Deze verificatiemodus is vanaf versie 3.0 beschikbaar en vergroot de mogelijkheden van gebruikersverificatie. Deze modus breidt aanmeldingsoplossingen uit naar de clientomgeving, Visual Studio Code, Visual Studio, Azure CLI, enzovoort.

Met deze verificatiemodus verkrijgt het stuurprogramma een token door 'DefaultAzureCredential' door te geven uit de Azure Identity-bibliotheek om een toegangstoken te verkrijgen. In deze modus wordt geprobeerd een set referentietypen te gebruiken om een toegangstoken op volgorde te verkrijgen. Afhankelijk van de gebruikte versie van de Azure Identity-bibliotheek, varieert de referentieset. Versiespecifieke verschillen worden vermeld in de lijst. Zie de Azure.Identity API-documentenvoor specifieke werking van azure-identiteitsversies.

Belangrijk

Active Directory Default is een handige optie om de verschillen tussen verbindingsreeksen tussen verschillende omgevingen te vereenvoudigen. Dit kan echter gevolgen hebben voor de prestaties, omdat deze op meerdere plaatsen moet zoeken naar verificatiegegevens. Als u trage verbindingssnelheden ziet met Active Directory Default, gebruik dan een andere verificatieoptie die specifiek gericht is op de verificatiemethode die u in uw omgeving gebruikt. "Active Directory Default" wordt niet aanbevolen voor omgevingen die strikte reactietijden op serviceniveau vereisen.

  • Omgevingsreferentie
    • Hiermee kunt u authenticatie met Microsoft Entra ID inschakelen met behulp van client en sleutel, of gebruikersnaam en wachtwoord, waarbij de details zijn geconfigureerd in de volgende omgevingsvariabelen: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (Meer informatie)
  • WerklastIdentityCredential
    • Hiermee schakelt u de verificatie van de workload-id van Microsoft Entra in op Kubernetes en andere hosts die de workloadidentiteit ondersteunen. Zie Microsoft Entra Workload-ID voor meer informatie. Beschikbaar vanaf Azure Identity versie 1.10 en Microsoft.Data.SqlClient 5.1.4.
  • BeheerdIdentityCredential
    • Probeert verificatie met Microsoft Entra-id met behulp van een beheerde identiteit die is toegewezen aan de implementatieomgeving. 'Client-id' van 'Door gebruiker toegewezen beheerde identiteit' wordt gelezen uit de verbindingseigenschap 'User Id'.
  • SharedTokenCacheCredential
    • Verifieert het gebruik van tokens in de lokale cache die wordt gedeeld tussen Microsoft-toepassingen.
  • VisualStudioCredential
    • Hiermee schakelt u verificatie met Microsoft Entra-id in met behulp van gegevens uit Visual Studio
  • VisualStudioCodeCredential
    • Hiermee schakelt u verificatie met Microsoft Entra-id in met behulp van gegevens uit Visual Studio Code.
  • AzurePowerShellCredential
    • Hiermee schakelt u verificatie met Microsoft Entra-id in met behulp van Azure PowerShell. Beschikbaar vanaf Azure Identity versie 1.6 en Microsoft.Data.SqlClient 5.0.
  • AzureCliCredential
    • Hiermee schakelt u verificatie met Microsoft Entra-id in met behulp van de Azure CLI om een toegangstoken te verkrijgen.
  • AzureDeveloperCliCredential
    • Hiermee schakelt u verificatie in voor Microsoft Entra ID met behulp van Azure Developer CLI om een toegangstoken te verkrijgen. Beschikbaar vanaf Azure Identity versie 1.10 en Microsoft.Data.SqlClient 5.1.4.

Notitie

InteractiveBrowserCredential is uitgeschakeld in de stuurprogrammaimplementatie van Active Directory Default en Active Directory Interactive is de enige optie die beschikbaar is om een token te verkrijgen met behulp van MFA/Interactive-verificatie.

Verdere aanpassingsopties zijn momenteel niet beschikbaar.

In het volgende voorbeeld ziet u hoe u Active Directory-standaardverificatie gebruikt.

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

Het gebruik van workloadidentiteitsverificatie

Beschikbaar vanaf versie 5.2, gebruikt de workloadidentiteit verificatiemodus, net zoals bij beheerde identiteiten, de waarde van de parameter User ID in de verbindingsreeks voor de client-ID, indien opgegeven. Maar in tegenstelling tot beheerde identiteit, wordt de waarde van WorkloadIdentityCredentialOptions standaard ingesteld op basis van omgevingsvariabelen: AZURE_TENANT_ID, AZURE_CLIENT_ID en AZURE_FEDERATED_TOKEN_FILE. Alleen de Client-ID kan echter worden overschreven door de verbindingsreeks.

In het volgende voorbeeld ziet u Active Directory Workload Identity verificatie met een door de gebruiker toegewezen beheerde identiteit met Microsoft.Data.SqlClient v5.2 en.

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

Microsoft Entra-verificatie aanpassen

Naast het gebruik van de Microsoft Entra-verificatie die is ingebouwd in het stuurprogramma, bieden Microsoft.Data.SqlClient 2.1.0 en hoger toepassingen de mogelijkheid om Microsoft Entra-verificatie aan te passen. De aanpassing is gebaseerd op de ActiveDirectoryAuthenticationProvider klasse, die is afgeleid van de SqlAuthenticationProvider abstracte klasse.

Tijdens Microsoft Entra-verificatie kan de clienttoepassing een eigen ActiveDirectoryAuthenticationProvider klasse definiëren door:

  • Een aangepaste callback-methode gebruiken.
  • Geef een client-id van een toepassing door aan de MSAL-bibliotheek via het SqlClient-stuurprogramma voor het ophalen van toegangstokens.

In het volgende voorbeeld ziet u hoe u een aangepaste callback gebruikt wanneer Active Directory Device Code Flow verificatie wordt gebruikt.

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

Met een aangepaste ActiveDirectoryAuthenticationProvider-klasse kan een door de gebruiker gedefinieerde toepassingsclient-id worden doorgegeven aan SqlClient wanneer een ondersteunde Microsoft Entra-verificatiemodus wordt gebruikt. Ondersteunde Microsoft Entra-verificatiemodi zijn onder andere Active Directory Password, Active Directory Integrated, Active Directory Interactive, Active Directory Service Principalen Active Directory Device Code Flow.

De client-id van de toepassing kan ook worden geconfigureerd via SqlAuthenticationProviderConfigurationSection of SqlClientAuthenticationProviderConfigurationSection. De configuratie-eigenschap applicationClientId is van toepassing op .NET Framework 4.6+ en .NET Core 2.1+.

Het volgende codefragment is een voorbeeld van het gebruik van een aangepaste ActiveDirectoryAuthenticationProvider-klasse met een door de gebruiker gedefinieerde toepassingsclient-id wanneer Active Directory Interactive verificatie wordt gebruikt.

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

In het volgende voorbeeld ziet u hoe u een client-id van een toepassing instelt via een configuratiesectie.

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

AccessTokenCallback gebruiken

Vanaf versie 5.2 is er een nieuwe eigenschap AccessTokenCallback op SqlConnection. Gebruik de eigenschap AccessTokenCallback om een aangepaste functie te definiëren die een toegangstoken retourneert op basis van de binnenkomende parameters. Het gebruik van de callback is beter dan het gebruik van de eigenschap AccessToken omdat hiermee het toegangstoken kan worden vernieuwd binnen een verbindingsgroep. Wanneer u de eigenschap AccessToken gebruikt, kan het token niet worden bijgewerkt nadat de verbinding is geopend. Er is ook geen bijbehorende vervaldatum bij de eigenschap opgegeven. Zodra het token is verlopen, mislukken nieuwe verbindingsaanvragen met een serververificatiefout en moeten pools die het gebruiken handmatig worden gewist.

Belangrijk

An AccessTokenCallback moet toegangstokens van dezelfde beveiligingscontext retourneren voor dezelfde invoerparameters. Als de beveiligingscontext anders is, kan een gegroepeerde verbinding met de verkeerde beveiligingscontext worden geretourneerd voor een verbindingsaanvraag.

Notitie

AccessTokenCallback maakt deel uit van de sleutel die wordt gebruikt om verbindingsgroepen te identificeren. Vermijd het maken van een nieuwe functie-callback voor elke creatie van een SqlConnection, omdat dat elke keer resulteert in een nieuwe pool. Verwijs naar hetzelfde exemplaar van een functie voor verbindingen die u in aanmerking wilt laten komen voor pooling. De sleutel van de verbindingsgroep bevat parameters die op de juiste manier worden doorgegeven aan de callback om verbindingsgroepen te partitioneren.

Het volgende codefragment is een voorbeeld van het gebruik van de eigenschap AccessTokenCallback in Microsoft.Data.SqlClient v5.2 en.

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using Azure.Core;
using Azure.Identity;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        OpenSqlConnection();
        Console.ReadLine();
    }

    const string defaultScopeSuffix = "/.default";

    // Reuse credential objects to take advantage of underlying token caches.
    private static ConcurrentDictionary<string, DefaultAzureCredential> credentials = new ConcurrentDictionary<string, DefaultAzureCredential>();

    // Use a shared callback function for connections that should be in the same connection pool.
    private static Func<SqlAuthenticationParameters, CancellationToken, Task<SqlAuthenticationToken>> myAccessTokenCallback =
        async (authParams, cancellationToken) =>
        {
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";

            DefaultAzureCredentialOptions options = new DefaultAzureCredentialOptions();
            options.ManagedIdentityClientId = authParams.UserId;

            // Reuse the same credential object if we are using the same MI Client Id.
            AccessToken token = await credentials.GetOrAdd(authParams.UserId, new DefaultAzureCredential(options)).GetTokenAsync(
                new TokenRequestContext(new string[] { scope }),
                cancellationToken);

            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        };

    private static void OpenSqlConnection()
    {
        // (Optional) Pass a User-Assigned Managed Identity Client ID.
        // This will ensure different MI Client IDs are in different connection pools.
        string connectionString = "Server=myServer.database.windows.net;Encrypt=Mandatory;UserId=<ManagedIdentitityClientId>;";

        using (SqlConnection connection = new SqlConnection(connectionString)
        {
            // The callback function is part of the connection pool key. Using a static callback function
            // ensures connections will not create a new pool per connection just for the callback.
            AccessTokenCallback = myAccessTokenCallback
        })
        {
            connection.Open();
            Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
            Console.WriteLine("State: {0}", connection.State);
        }
    }
}

Ondersteuning voor een aangepaste SQL-verificatieprovider

Gezien meer flexibiliteit kan de clienttoepassing ook een eigen provider gebruiken voor Microsoft Entra-verificatie in plaats van de ActiveDirectoryAuthenticationProvider-klasse te gebruiken. De aangepaste verificatieprovider moet een subklasse van SqlAuthenticationProvider zijn met overschreven methoden. Vervolgens moet de aangepaste provider worden geregistreerd, waarbij een of meer van de bestaande Active Directory* verificatiemethoden worden overschreven.

Belangrijk

Een verificatieprovider moet toegangstokens van dezelfde beveiligingscontext retourneren voor dezelfde invoerparameters. Als de beveiligingscontext anders is, kan een gegroepeerde verbinding met de verkeerde beveiligingscontext worden geretourneerd voor een verbindingsaanvraag.

In het volgende voorbeeld ziet u hoe u een nieuwe verificatieprovider gebruikt voor Active Directory Device Code Flow-verificatie.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Microsoft.Identity.Client;

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
    {
        private const string ClientId = "my-client-id";
        private const string ClientName = "My Application Name";
        private const string DefaultScopeSuffix = "/.default";

        // Maintain a copy of the PublicClientApplication object to cache the underlying access tokens it provides
        private static IPublicClientApplication pcApplication;

        public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
        {
            string[] scopes = [ parameters.Resource.EndsWith(DefaultScopeSuffix) ? parameters.Resource : parameters.Resource + DefaultScopeSuffix ];

            IPublicClientApplication app = pcApplication;
            if (app == null)
            {
                pcApplication = app = PublicClientApplicationBuilder.Create(ClientId)
                    .WithAuthority(parameters.Authority)
                    .WithClientName(ClientName)
                    .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                    .Build();
            }

            AuthenticationResult result;
            using CancellationTokenSource connectionTimeoutCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(parameters.ConnectionTimeout));

            try
            {
                IEnumerable<IAccount> accounts = await app.GetAccountsAsync();
                result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                    .ExecuteAsync(connectionTimeoutCancellation.Token);
            }
            catch (MsalUiRequiredException)
            {
                result = await app.AcquireTokenWithDeviceCode(scopes, deviceCodeResult => CustomDeviceFlowCallback(deviceCodeResult))
                    .ExecuteAsync(connectionTimeoutCancellation.Token);
            }

            return new SqlAuthenticationToken(result.AccessToken, result.ExpiresOn);
        }

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

        private static Task CustomDeviceFlowCallback(DeviceCodeResult result)
        {
            Console.WriteLine(result.Message);
            return Task.CompletedTask;
        }
    }

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

Naast het verbeteren van de Active Directory Interactive verificatie-ervaring, bieden Microsoft.Data.SqlClient 2.1.0 en hoger de volgende API's voor clienttoepassingen voor het aanpassen van interactieve verificatie- en apparaatcodestroomverificatie.

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 .NET for iOS), Activity
    // (if using .NET for 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 lets
    // 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();
}

Zie ook