Sprache

SqlConnection.AccessTokenCallback Eigenschaft

Definition

Ruft den Zugriffstokenrückruf für die Verbindung ab oder legt ihn fest.

public:
 property Func<Microsoft::Data::SqlClient::SqlAuthenticationParameters ^, System::Threading::CancellationToken, System::Threading::Tasks::Task<Microsoft::Data::SqlClient::SqlAuthenticationToken ^> ^> ^ AccessTokenCallback { Func<Microsoft::Data::SqlClient::SqlAuthenticationParameters ^, System::Threading::CancellationToken, System::Threading::Tasks::Task<Microsoft::Data::SqlClient::SqlAuthenticationToken ^> ^> ^ get(); void set(Func<Microsoft::Data::SqlClient::SqlAuthenticationParameters ^, System::Threading::CancellationToken, System::Threading::Tasks::Task<Microsoft::Data::SqlClient::SqlAuthenticationToken ^> ^> ^ value); };
public Func<Microsoft.Data.SqlClient.SqlAuthenticationParameters,System.Threading.CancellationToken,System.Threading.Tasks.Task<Microsoft.Data.SqlClient.SqlAuthenticationToken>> AccessTokenCallback { get; set; }
member this.AccessTokenCallback : Func<Microsoft.Data.SqlClient.SqlAuthenticationParameters, System.Threading.CancellationToken, System.Threading.Tasks.Task<Microsoft.Data.SqlClient.SqlAuthenticationToken>> with get, set
Public Property AccessTokenCallback As Func(Of SqlAuthenticationParameters, CancellationToken, Task(Of SqlAuthenticationToken))

Eigenschaftswert

Der Func, der ein SqlAuthenticationParameters und CancellationToken zurückgibt.SqlAuthenticationToken

Ausnahmen

Dies AccessTokenCallback wird mit anderen in Konflikt stehenden Authentifizierungskonfigurationen kombiniert.

Beispiele

Im folgenden Beispiel wird das Definieren und Festlegen eines AccessTokenCallback.

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 ConcurrentDictionar<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=<ManagedIdentityClientId>;";

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

Hinweise

Die AccessTokenCallback-Funktion selbst ist Teil des Verbindungspoolschlüssels. Dieselbe Rückruffunktion sollte immer ein gültiges Zugriffstoken desselben Sicherheitskontexts bereitstellen, wenn dieselben SqlAuthenticationParameters vorhanden sind. Wenn mehrere Verbindungen dieselbe Rückruffunktion verwenden und alle anderen Eigenschaften, die den Poolschlüssel umfassen, identisch sind, werden sie in denselben Verbindungspool gruppiert.

Der Treiber verwaltet die Tokenaktualisierung und verwirft poolierte Verbindungen mit abgelaufenen oder fast abgelaufenen Token vor der Wiederverwendung. Verbindungen, die innerhalb derselben aktiven Transaktion verwendet oder wiederverwendet werden, sind davon nicht betroffen.

Neue physische Verbindungen rufen den Rückruf nur auf, wenn ein zwischengespeichertes Token fehlt oder eine Aktualisierung erforderlich ist. Durch die erneute Wiederverwendung einer poolierten Verbindung wird der Rückruf nicht aufgerufen.

Diese Eigenschaft schließt sich unter anderem gegenseitig mit den AccessToken Eigenschaften aus SspiContextProvider . Wenn diese Eigenschaft SspiContextProvider bereits festgelegt wird, wird ausgelöst InvalidOperationException, da SSPI eine Alternative zur tokenbasierten Authentifizierung ist.

Gilt für: