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

Применимо: платформа .NET Framework .NET Standard

Скачать ADO.NET

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

Примечание.

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

Обзор

Проверка подлинности Microsoft Entra использует удостоверения в идентификаторе Microsoft Entra для доступа к источникам данных, таким как База данных SQL Azure, Управляемый экземпляр SQL Azure и 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. Для выполнения проверки подлинности используется идентификатор клиента и секрет удостоверения субъекта-службы.

  • Дополнительные режимы проверки подлинности добавлены в 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=***";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

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

Чтобы использовать Active Directory Integrated режим проверки подлинности, необходимо иметь экземпляр локальная служба Active Directory, присоединенный к идентификатору Microsoft Entra в облаке. Например, можно настроить федерацию с помощью службы федерации Active Directory (AD FS) (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 клиентское приложение может подключаться к источникам данных SQL Azure, предоставляя идентификатор клиента и секрет удостоверения субъекта-службы. Проверка подлинности на основе субъекта-службы включает следующие действия:

  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=secret";

using (SqlConnection conn = new SqlConnection(ConnectionString)) {
    conn.Open();
}

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

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

Если используется этот режим, нельзя задать свойство 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, предоставляя удостоверение и используя его для получения маркеров доступа. Этот метод устраняет необходимость управления учетными данными и секретами и может упростить управление доступом.

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

  • Управляемое удостоверение , назначаемое системой, создается в составе ресурса 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 см. в документации по API Azure.Identity.

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

Примечание.

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

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

В следующем примере показано, как использовать проверку подлинности 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 PrincipalActive 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>

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

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

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

using System;
using System.Threading.Tasks;
using Microsoft.Identity.Client;
using Microsoft.Data.SqlClient;

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
    {
        public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
        {
            string clientId = "my-client-id";
            string clientName = "My Application Name";
            string s_defaultScopeSuffix = "/.default";

            string[] scopes = new string[] { parameters.Resource.EndsWith(s_defaultScopeSuffix) ? parameters.Resource : parameters.Resource + s_defaultScopeSuffix };

            IPublicClientApplication app = PublicClientApplicationBuilder.Create(clientId)
                .WithAuthority(parameters.Authority)
                .WithClientName(clientName)
                .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                .Build();

            AuthenticationResult result = await app.AcquireTokenWithDeviceCode(scopes,
                    deviceCodeResult => CustomDeviceFlowCallback(deviceCodeResult)).ExecuteAsync();
            return new SqlAuthenticationToken(result.AccessToken, result.ExpiresOn);
        }

        public override bool IsSupported(SqlAuthenticationMethod authenticationMethod) => authenticationMethod.Equals(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow);

        private Task CustomDeviceFlowCallback(DeviceCodeResult result)
        {
            Console.WriteLine(result.Message);
            return Task.FromResult(0);
        }
    }

    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 Xamarin.iOS), Activity (if using Xamarin.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 will let 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();
}

См. также