Поделиться через


Подключитесь к Azure SQL с помощью проверки подлинности Microsoft Entra и SqlClient

Область применения:.NET Framework .NET .NET Standard

Скачать ADO.NET

В этой статье описывается, как подключиться к источникам данных SQL Azure с помощью проверки подлинности Microsoft Entra из приложения .NET с помощью SqlClient.

Примечание.

Несмотря на то, что идентификатор Microsoft Entra ID — это новое название Azure Active Directory (Azure AD), чтобы избежать нарушения существующих сред, Azure AD по-прежнему используется в некоторых жестко закодированных элементах, таких как поля пользовательского интерфейса, поставщики подключений, коды ошибок и командлеты. В этой статье два имени являются взаимозаменяемыми.

Обзор

Проверка подлинности Microsoft Entra использует удостоверения в Microsoft Entra ID для доступа к источникам данных, таким как Azure SQL Database, Azure SQL Managed Instance и Azure Synapse Analytics. Пространство имен Microsoft.Data.SqlClient позволяет клиентским приложениям указывать учетные данные Microsoft Entra в различных способах аутентификации при подключении к базе данных SQL Azure и управляемому экземпляру SQL Azure. Чтобы использовать проверку подлинности Microsoft Entra с помощью SQL Azure, необходимо настроить проверку подлинности Microsoft Entra и управлять ими с помощью SQL Azure.

При установке Authentication свойства подключения в строке подключения клиент может выбрать предпочтительный режим проверки подлинности Microsoft Entra в соответствии с указанным значением.

  • Самая ранняя версия Microsoft.Data.SqlClient поддерживает Active Directory Password для .NET Framework, .NET Core и .NET Standard. Также она поддерживает проверку подлинности Active Directory Integrated и Active Directory Interactive для платформы .NET Framework.

  • Начиная с Microsoft.Data.SqlClient 2.0.0 поддержка Active Directory Integrated и Active Directory Interactive проверки подлинности распространяется на платформы .NET Framework, .NET Core и .NET Standard.

    Также в SqlClient 2.0.0 добавлен новый режим проверки подлинности Active Directory Service Principal. Для выполнения аутентификации используется ID клиента и секретный ключ служебной сущности.

  • Дополнительные режимы проверки подлинности добавлены в Microsoft.Data.SqlClient версии 2.1.0, в том числе Active Directory Device Code Flow и Active Directory Managed Identity (или Active Directory MSI). Эти новые режимы позволяют приложению получить маркер доступа для подключения к серверу.

Сведения о проверке подлинности Microsoft Entra за пределами описанных ниже разделов см. в разделе "Использование проверки подлинности Microsoft Entra".

Настройка проверки подлинности Microsoft Entra

При подключении приложения к источникам данных SQL Azure с помощью проверки подлинности Microsoft Entra необходимо предоставить допустимый режим проверки подлинности. В следующей таблице перечислены поддерживаемые режимы проверки подлинности. Приложение может задать режим через свойство подключения Authentication в строке подключения.

значение Описание Microsoft.Data.SqlClient, версия
Пароль Active Directory Проверка подлинности с помощью имени пользователя и пароля удостоверения Microsoft Entra 1.0+
Интеграция с Active Directory Аутентифицируйтесь с помощью удостоверения Microsoft Entra с использованием встроенной Windows-аутентификации (IWA) 2.0.0 и выше1
Интерактивная проверка подлинности Active Directory Аутентификация с использованием идентификации Microsoft Entra через интерактивную проверку подлинности 2.0.0 и выше1
Главная учетная запись службы Active Directory Аутентификация с помощью учетной записи Microsoft Entra, используя идентификатор клиента и секрет 2.0.0 и выше
Поток кода устройства для Active Directory Проверка подлинности с помощью удостоверения Microsoft Entra с помощью режима потока кода устройства 2.1.0 и выше
Управляемое удостоверение Active Directory,
Active Directory MSI
Проверка подлинности с помощью назначаемого системой или назначаемого пользователем управляемого удостоверения Microsoft Entra 2.1.0 и выше
Active Directory по умолчанию Аутентификация с помощью удостоверения Microsoft Entra с использованием механизмов без паролей и неинтерактивных, включая управляемые удостоверения, Visual Studio Code, Visual Studio, Azure CLI и т. д. 3.0.0+
Идентификация рабочей нагрузки Active Directory Аутентификация с использованием федеративного назначенного пользователем управляемого удостоверения Microsoft Entra для подключения к базе данных SQL из клиентских сред Azure, настроенных для Удостоверения рабочей нагрузки. 5.2.0+

1 В версиях Microsoft.Data.SqlClient ниже 2.0.0 режимы проверки подлинности Active Directory Integrated и Active Directory Interactive поддерживаются только для .NET Framework.

Использование проверки подлинности паролей

Active Directory Password Режим проверки подлинности поддерживает проверку подлинности в источниках данных Azure с идентификатором Microsoft Entra для собственных или федеративных пользователей Microsoft Entra. При использовании этого режима в строке подключения необходимо указать учетные данные пользователя. Следующий пример демонстрирует, как использовать аутентификацию Active Directory Password.

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

Использование встроенной проверки подлинности

Чтобы использовать Active Directory Integrated режим проверки подлинности, необходимо иметь экземпляр локальной службы Active Directory, присоединенный к Microsoft Entra ID в облаке. Например, можно настроить федерацию с помощью службы федерации Active Directory Federation Services (AD FS).

В этом режиме после входа на присоединенный к домену компьютер вы сможете получать доступ к источникам данных Azure SQL, не вводя учетные данные. Имя пользователя и пароль нельзя указывать в строке подключения для приложений .NET Framework. Имя пользователя является необязательным параметром в строке подключения для приложений .NET Core и .NET Standard. В этом режиме нельзя задать свойство Credential для SqlConnection.

Следующий фрагмент кода служит примером использования аутентификации Active Directory Integrated.

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

Использование интерактивной проверки подлинности

Проверка подлинности Active Directory Interactive поддерживает технологию многофакторной проверки подлинности для подключения к источникам данных Azure SQL. Если вы указываете этот режим проверки подлинности в строке подключения, появится экран проверки подлинности Azure и попросит пользователя ввести действительные учетные данные. Вы не сможете указать пароль в строке подключения.

В этом режиме нельзя задать свойство Credential для SqlConnection. При использовании Microsoft.Data.SqlClient версии 2.0.0 и выше в интерактивном режиме можно указывать имя пользователя в строке подключения.

Следующий пример демонстрирует, как использовать аутентификацию Active Directory Interactive.

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

Использование аутентификации на основе служебного субъекта

В режиме проверки подлинности Active Directory Service Principal клиентское приложение может подключаться к источникам данных в Azure SQL, предоставляя идентификатор клиента и секрет учетной записи главного пользователя службы. Аутентификация с использованием учетной записи службы включает:

  1. Настройка регистрации приложения с секретным ключом.
  2. предоставление приложению разрешений в экземпляре базы данных Azure SQL;
  3. подключение с использованием правильных учетных данных.

Следующий пример демонстрирует, как использовать аутентификацию Active Directory Service Principal.

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

Использование проверки подлинности с помощью потока кода устройства

При использовании библиотеки проверки подлинности Майкрософт для .NET (MSAL.NET) клиентское приложение сможет использовать проверку подлинности Active Directory Device Code Flow для подключения к источникам данных SQL Azure с устройств и операционных систем, в которых нет интерактивного веб-браузера. Интерактивная проверка подлинности выполняется на другом устройстве. Для получения дополнительной информации о методе аутентификации с использованием потока кода устройства, см. OAuth 2.0 Device Code Flow.

Если используется этот режим, нельзя задать свойство Credential для SqlConnection. Кроме того, нельзя указать имя пользователя и пароль в строке подключения.

Следующий фрагмент кода демонстрирует использование Active Directory Device Code Flow аутентификации.

Примечание.

Значение времени ожидания по умолчанию для Active Directory Device Code Flow основывается на настройках подключения Connect Timeout. Убедитесь, что вы указываете Connect Timeout, который предоставляет достаточно времени для прохождения процесса аутентификации через поток кода устройства.

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

Использование проверки подлинности для управляемой идентификации

Проверка подлинности с помощью управляемых удостоверений для ресурсов Azure — это рекомендуемый метод проверки подлинности для программного доступа к SQL. Клиентское приложение может использовать управляемую личность, назначаемую системой или пользователем, для аутентификации в SQL с использованием идентификатора Microsoft Entra ID, предоставляя личность и используя её для получения маркеров доступа. Этот метод устраняет необходимость управления учетными данными и секретами и может упростить управление доступом.

Существует два типа управляемых удостоверений:

  • Назначаемое системой управляемое удостоверение создается в составе ресурса Azure (например, управляемого экземпляра SQL или логического сервера) и разделяет жизненный цикл этого ресурса. Назначаемые системой удостоверения могут быть связаны только с одним ресурсом Azure.
  • Назначаемое пользователем управляемое удостоверение создается как изолированный ресурс Azure. Элемент может быть назначен одному или нескольким экземплярам службы Azure.

Дополнительные сведения об управляемых удостоверениях см. в статье Что такое управляемые удостоверения для ресурсов Azure?

Начиная с версии Microsoft.Data.SqlClient 2.1.0, драйвер поддерживает проверку подлинности в Базе данных SQL Azure, Azure Synapse Analytics и Управляемом экземпляре Azure SQL путем получения маркеров доступа по управляемому удостоверению. Чтобы использовать такую проверку подлинности, укажите Active Directory Managed Identity или Active Directory MSI в строке подключения. Пароль при этом не требуется. В этом режиме также нельзя задать свойство Credential для SqlConnection.

Для назначаемого пользователем управляемого удостоверения необходимо указать идентификатор клиента для управляемого удостоверения, если вы используете Microsoft.Data.SqlClient версии 3.0 или более поздней. При использовании Microsoft.Data.SqlClient версии 2.1 требуется указать идентификатор объекта управляемой учетной записи.

Следующий пример демонстрирует, как использовать аутентификацию Active Directory Managed Identity с управляемым удостоверением, которое назначается системой.

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

В следующем примере демонстрируется проверка подлинности Active Directory Managed Identity с управляемым удостоверением, назначаемым пользователем, с помощью Microsoft.Data.SqlClient версии 3.0 или более поздней.

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

В следующем примере демонстрируется проверка подлинности Active Directory Managed Identity с управляемым удостоверением, назначаемым пользователем, с помощью Microsoft.Data.SqlClient версии 2.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();
}

Использование проверки подлинности по умолчанию

Доступные начиная с версии 3.0, этот режим проверки подлинности расширяет возможности проверки подлинности пользователей. Этот режим расширяет решения для входа в клиентную среду, Visual Studio Code, Visual Studio, Azure CLI и т. д.

В этом режиме проверки подлинности драйвер получает маркер, передавая DefaultAzureCredential из библиотеки удостоверений Azure для получения маркера доступа. Этот режим пытается использовать набор типов учетных данных для получения токена доступа по порядку. В зависимости от используемой версии библиотеки удостоверений Azure набор учетных данных варьируется. В списке указаны конкретные различия версий. Сведения о поведении версии Azure Identity см. в документации по API Azure.Identity.

Это важно

Стандартные настройки Active Directory являются удобным вариантом для упрощения различий в строках подключения между различными средами. Однако она может оказать влияние на производительность, так как она должна искать сведения о проверке подлинности в нескольких местах. Если вы видите медленные скорости подключения с помощью По умолчанию Active Directory, используйте другой параметр проверки подлинности, предназначенный специально для метода проверки подлинности, используемого в вашей среде. Параметр "По умолчанию Active Directory" не рекомендуется использовать для сред, где строго задано время отклика на уровне обслуживания.

  • EnvironmentCredential (Окружающая средаУчетные данные)
    • Включает аутентификацию с помощью Microsoft Entra ID, используя сведения клиента и секрета, либо имя пользователя и пароль, которые настроены в следующих переменных среды: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (дополнительные сведения)
  • WorkloadIdentityCredential
    • Включает проверку подлинности с помощью идентификации рабочей нагрузки Microsoft Entra на Kubernetes и других узлах, поддерживающих идентификацию рабочей нагрузки. Дополнительные сведения см. на странице Идентификатор рабочей нагрузки Microsoft Entra. Доступно начиная с Azure Identity версии 1.10 и Microsoft.Data.SqlClient 5.1.4.
  • ManagedIdentityCredential
    • Проверяет подлинность с помощью Microsoft Entra ID и управляемой идентичности, назначенной для среды развертывания. "Client Id" для пользовательского назначенного управляемого удостоверения извлекается из свойства подключения "User Id".
  • SharedTokenCacheCredential (Общие учетные данные кэша токенов)
    • Проверяет подлинность с использованием токенов в локальном кэше, совместно используемом приложениями Майкрософт.
  • VisualStudioCredential
    • Включение проверки подлинности с помощью Microsoft Entra ID с использованием данных из Visual Studio.
  • VisualStudioCodeCredential
    • Позволяет использовать аутентификацию с Microsoft Entra ID с данными из Visual Studio Code.
  • AzurePowerShellCredential
    • Включает проверку подлинности с помощью идентификатора Microsoft Entra с помощью Azure PowerShell. Доступно начиная с Azure Identity версии 1.6 и Microsoft.Data.SqlClient 5.0.
  • AzureCliCredential
    • Включает аутентификацию с помощью Microsoft Entra ID через Azure CLI для получения токена доступа.
  • AzureDeveloperCliCredential
    • Обеспечивает проверку подлинности в Microsoft Entra ID с помощью интерфейса командной строки разработчика Azure для получения токена доступа. Доступно начиная с Azure Identity версии 1.10 и Microsoft.Data.SqlClient 5.1.4.

Примечание.

InteractiveBrowserCredential отключен в реализации драйвера Active Directory по умолчанию, а Active Directory Interactive — единственный вариант, доступный для получения токена с помощью многофакторной или интерактивной аутентификации.

Дополнительные варианты настройки в данный момент недоступны.

В следующем примере показано, как использовать проверку подлинности Active Directory по умолчанию.

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

Аутентификация с использованием удостоверения рабочей нагрузки

Доступно начиная с версии 5.2, так же как с управляемыми идентичностями, режим проверки подлинности идентичности рабочей нагрузки использует значение параметра в строке подключения для идентификатора клиента, если он указан. Но в отличие от управляемой идентичности, WorkloadIdentityCredentialOptions по умолчанию использует значение из переменных среды: AZURE_TENANT_ID, AZURE_CLIENT_ID и AZURE_FEDERATED_TOKEN_FILE. Однако только идентификатор клиента можно переопределить с помощью строки подключения.

В следующем примере показана Active Directory Workload Identity проверка подлинности с назначаемым пользователем управляемым удостоверением с использованием Microsoft.Data.SqlClient версии 5.2 и выше.

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

Помимо использования проверки подлинности Microsoft Entra, встроенной в драйвер, Microsoft.Data.SqlClient 2.1.0 и более поздних версий предоставляют приложения для настройки проверки подлинности Microsoft Entra. Эта настройка основывается на классе ActiveDirectoryAuthenticationProvider, который является производным от абстрактного класса SqlAuthenticationProvider.

Во время проверки подлинности Microsoft Entra клиентское приложение может определить собственный ActiveDirectoryAuthenticationProvider класс с помощью следующих способов:

  • с помощью настраиваемого метода обратного вызова.
  • Передача идентификатора клиента приложения в библиотеку MSAL через драйвер SqlClient для получения токенов доступа.

Следующий пример демонстрирует, как использовать настраиваемый обратный вызов при использовании аутентификации Active Directory Device Code Flow.

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

С настраиваемым ActiveDirectoryAuthenticationProvider классом идентификатор клиента приложения, определяемый пользователем, можно передать в SqlClient при использовании поддерживаемого режима проверки подлинности Microsoft Entra. Поддерживаемые режимы проверки подлинности Microsoft Entra включают Active Directory Password, Active Directory Integrated, Active Directory Interactive, Active Directory Service Principal и Active Directory Device Code Flow.

Также идентификатор клиента приложения можно настроить с помощью SqlAuthenticationProviderConfigurationSection или SqlClientAuthenticationProviderConfigurationSection. Свойство конфигурации applicationClientId применяется к .NET Framework 4.6 и выше и .NET Core 2.1 и выше.

Следующий фрагмент кода демонстрирует пример использования настраиваемого класса ActiveDirectoryAuthenticationProvider с определяемым пользователем идентификатором клиента приложения при работе с проверкой подлинности Active Directory Interactive.

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

Следующий пример демонстрирует, как задать идентификатор клиента приложения в разделе конфигурации.

<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

Доступно начиная с версии 5.2, появилось новое свойство AccessTokenCallback в SqlConnection. Используйте свойство AccessTokenCallback, чтобы определить пользовательскую функцию, которая возвращает маркер доступа на основе входящих параметров. Использование callback-функции лучше, чем использование свойства AccessToken, так как это позволяет обновлять токен доступа в пуле подключений. При использовании AccessToken свойства маркер нельзя обновить после открытия подключения. В свойстве также нет даты окончания срока действия. После истечения срока действия токена новые запросы на подключение завершаются с ошибкой аутентификации сервера, и пулы, использующие его, необходимо очистить вручную.

Это важно

AccessTokenCallback должен возвращать токены доступа того же контекста безопасности для тех же входных параметров. Если контекст безопасности отличается, для запроса на подключение может быть возвращено объединенное соединение с неправильным контекстом безопасности.

Примечание.

AccessTokenCallback является частью ключа, используемого для определения пулов подключений. Избегайте создания нового обратного вызова функции для каждого создания SqlConnection, так как это каждый раз приводит к созданию нового пула. Ссылайтесь на один и тот же экземпляр функции в отношении соединений, которые вы хотите учитывать для объединения в пул. Ключ пула подключений включает параметры, передаваемые в обратный вызов для соответствующего разделения пулов подключений.

Следующий фрагмент кода является примером использования свойства AccessTokenCallback в Microsoft.Data.SqlClient начиная с версии 5.2.

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

Поддержка настраиваемого поставщика проверки подлинности SQL

При наличии большей гибкости клиентское приложение может использовать собственного провайдера для проверки подлинности Microsoft Entra вместо использования класса ActiveDirectoryAuthenticationProvider. Пользовательский провайдер аутентификации должен быть подклассом SqlAuthenticationProvider с переопределёнными методами. Затем необходимо зарегистрировать настраиваемого поставщика, переопределив один или несколько существующих методов аутентификации Active Directory*.

Это важно

Провайдер аутентификации должен возвращать токены доступа единого контекста безопасности для отдельных входных параметров. Если контекст безопасности отличается, для запроса на подключение может быть возвращено объединенное соединение с неправильным контекстом безопасности.

Следующий пример демонстрирует, как использовать нового поставщика аутентификации для Active Directory Device Code Flow.

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

Наряду с улучшением интерфейса для проверки подлинности Active Directory Interactive в Microsoft.Data.SqlClient версии 2.1.0 и выше клиентским приложениям предоставляются следующие API для настройки интерактивной проверки подлинности и проверки подлинности в потоке кода устройства.

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

См. также