Jazyk

SqlConnection.AccessTokenCallback Vlastnost

Definice

Získá nebo nastaví zpětné volání přístupového tokenu pro připojení.

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

Hodnota vlastnosti

Func, který vezme SqlAuthenticationParameters a CancellationToken vrátí .SqlAuthenticationToken

Výjimky

Kombinuje AccessTokenCallback se s dalšími konfliktní konfigurací ověřování.

Příklady

Následující příklad ukazuje, jak definovat a nastavit 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);
        }
    }
}

Poznámky

Samotná funkce AccessTokenCallback je součástí klíče fondu připojení. Stejná funkce zpětného volání by měla vždy poskytovat platný přístupový token stejného kontextu zabezpečení vzhledem ke stejnému sqlAuthenticationParameters. Pokud více připojení používá stejnou funkci zpětného volání a všechny ostatní vlastnosti, které tvoří klíč fondu, jsou stejné, budou seskupeny do stejného fondu připojení.

Ovladač spravuje aktualizaci tokenů a před opětovným použitím zahodí připojení ve fondu s prošlými nebo téměř prošlými tokeny. Připojení, která se používají nebo opakovaně používají ve stejné aktivní transakci, nejsou ovlivněná.

Nová fyzická připojení volají zpětná volání pouze v případech, kdy chybí token v mezipaměti nebo potřebuje aktualizaci. Opětovné použití připojení ve fondu nevyvolá zpětné volání.

Tato vlastnost se vzájemně vylučují s vlastnostmi AccessToken a SspiContextProvider vlastnostmi mimo jiné. Nastavení této vlastnosti, pokud SspiContextProvider je již nastavena InvalidOperationException, protože SSPI je alternativou k ověřování na základě tokenu.

Platí pro