Dil

SqlConnection.AccessTokenCallback Özellik

Tanım

Bağlantı için erişim belirteci geri çağırmasını alır veya ayarlar.

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

Özellik Değeri

ve CancellationToken değerini alan SqlAuthenticationParameters ve döndüren SqlAuthenticationTokenFunc.

Özel durumlar

AccessTokenCallback diğer çakışan kimlik doğrulama yapılandırmalarıyla birleştirilir.

Örnekler

Aşağıdaki örnekte bir öğesinin nasıl tanımlanacağı ve ayarlanacağı gösterilmektedir 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);
        }
    }
}

Açıklamalar

AccessTokenCallback işlevinin kendisi bağlantı havuzu anahtarının bir parçasıdır. Aynı geri çağırma işlevi her zaman aynı SqlAuthenticationParameters verilen aynı güvenlik bağlamında geçerli bir erişim belirteci sağlamalıdır. Birden çok bağlantı aynı geri çağırma işlevini kullandığında ve havuz anahtarını oluşturan diğer tüm özellikler aynı olduğunda, bunlar aynı bağlantı havuzuna gruplandırılır.

Sürücü, belirteç yenilemeyi yönetir ve yeniden kullanmadan önce süresi dolmuş veya süresi dolmak üzere olan belirteçlerle havuza alınmış bağlantıları atar. Kullanılan veya aynı etkin işlem içinde yeniden kullanılan bağlantılar etkilenmez.

Yeni fiziksel bağlantılar yalnızca önbelleğe alınmış bir belirteç eksik olduğunda veya yenilenmesi gerektiğinde geri çağırmayı çağırır. Havuza alınan bağlantıyı yeniden kullanma geri çağırmayı çağırmaz.

Bu özellik, diğerleri arasında ve SspiContextProvider özellikleriyle AccessToken birbirini dışlar. SSPI, belirteç tabanlı kimlik doğrulamasına alternatif olduğundan, bu özellik SspiContextProvider zaten ayarlandığında oluşturulur InvalidOperationException.

Şunlara uygulanır