Bahasa

SqlConnection.AccessTokenCallback Properti

Definisi

Mendapatkan atau mengatur panggilan balik token akses untuk koneksi.

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

Nilai Properti

Func yang mengambil SqlAuthenticationParameters dan CancellationToken dan mengembalikan SqlAuthenticationToken.

Pengecualian

dikombinasikan AccessTokenCallback dengan konfigurasi autentikasi lain yang bertentangan.

Contoh

Contoh berikut menunjukkan cara menentukan dan mengatur 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);
        }
    }
}

Keterangan

Fungsi AccessTokenCallback itu sendiri adalah bagian dari kunci kumpulan koneksi. Fungsi panggilan balik yang sama harus selalu memberikan token akses yang valid dari konteks keamanan yang sama mengingat SqlAuthenticationParameters yang sama. Ketika beberapa koneksi menggunakan fungsi panggilan balik yang sama, dan semua properti lain yang terdiri dari kunci kumpulan sama, koneksi akan dikelompokkan ke dalam kumpulan koneksi yang sama.

Driver mengelola refresh token dan membuang koneksi terkumpul dengan token yang kedaluwarsa atau hampir kedaluwarsa sebelum digunakan kembali. Koneksi yang digunakan atau digunakan kembali dalam transaksi aktif yang sama tidak terpengaruh.

Koneksi fisik baru memanggil panggilan balik hanya ketika token yang di-cache hilang atau perlu disegarkan. Menggunakan kembali koneksi yang dikumpulkan tidak memanggil panggilan balik.

Properti ini saling eksklusif dengan AccessToken properti dan SspiContextProvider , antara lain. Mengatur properti ini ketika SspiContextProvider sudah diatur melempar InvalidOperationException, karena SSPI adalah alternatif untuk autentikasi berbasis token.

Berlaku untuk