Подключение с помощью проверки подлинности Microsoft Entra
В этой статье содержатся сведения о разработке приложений Java, использующих функцию проверки подлинности Microsoft Entra с драйвером Microsoft JDBC для SQL Server.
Проверку подлинности Microsoft Entra можно использовать для подключения к База данных SQL Azure, экземпляру SQL Azure и Azure Synapse Analytics с помощью удостоверений в идентификаторе Microsoft Entra. Используйте проверку подлинности Microsoft Entra для централизованного управления удостоверениями пользователей базы данных и в качестве альтернативы проверке подлинности SQL Server. Драйвер JDBC позволяет указать учетные данные Microsoft Entra в строка подключения JDBC для подключения к SQL Azure. Сведения о настройке проверки подлинности Microsoft Entra см. в статье "Подключение к SQL Azure с помощью проверки подлинности Microsoft Entra".
Свойства подключения для поддержки проверки подлинности Microsoft Entra в драйвере Microsoft JDBC для SQL Server:
- authentication: с помощью этого свойства можно указать способ проверки подлинности SQL, используемый для подключения.
Возможные значения:
ActiveDirectoryManagedIdentity
- Так как драйвер версии 8.3.1
authentication=ActiveDirectoryMSI
можно использовать для подключения к База данных SQL Azure/Synapse Analytics из ресурса Azure с поддержкой удостоверений. При необходимости вместе с этим режимом проверки подлинности в свойствах подключения или источника данных можно указать msiClientId.msiClientId
должен содержать идентификатор клиента управляемого удостоверения, который будет использоваться для получения маркера доступа для установления соединения. Так как драйвер версии 12.2authentication=ActiveDirectoryManagedIdentity
также можно использовать для подключения к База данных SQL Azure/Synapse Analytics из ресурса Azure с поддержкой удостоверений. При необходимости идентификатор клиента управляемого удостоверения теперь можно задать в свойствеuser
. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryManagedIdentity".
- Так как драйвер версии 8.3.1
ActiveDirectoryDefault
- Так как драйвер версии 12.2
authentication=ActiveDirectoryDefault
можно использовать для подключения к AZURE SQL/Synapse Analytics через DefaultAzureCredential из клиентской библиотеки удостоверений Azure. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryDefault".
- Так как драйвер версии 12.2
ActiveDirectoryIntegrated
- Так как драйвер версии 6.0
authentication=ActiveDirectoryIntegrated
можно использовать для подключения к AZURE SQL/Synapse Analytics с помощью интегрированной проверки подлинности. Чтобы использовать этот режим проверки подлинности, необходимо федеративные службы федерации локальная служба Active Directory (ADFS) с идентификатором Microsoft Entra в облаке. После настройки вы можете подключиться, добавив собственную библиотекуmssql-jdbc_auth-<version>-<arch>.dll
в путь класса приложения в Windows или настроив билет Kerberos для поддержки кроссплатформенной проверки подлинности. Вы можете получить доступ к Azure SQL/Azure Synapse Analytics, не запрашивая учетные данные при входе на компьютер, присоединенный к домену. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryIntegrated".
- Так как драйвер версии 6.0
ActiveDirectoryPassword
- Так как драйвер версии 6.0
authentication=ActiveDirectoryPassword
можно использовать для подключения к AZURE SQL/Synapse Analytics с помощью имени пользователя и пароля Microsoft Entra. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryPassword".
- Так как драйвер версии 6.0
ActiveDirectoryInteractive
- Так как драйвер версии 9.2
authentication=ActiveDirectoryInteractive
можно использовать для подключения к AZURE SQL/Synapse Analytics с помощью интерактивного потока проверки подлинности (многофакторная проверка подлинности). Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryInteractive".
- Так как драйвер версии 9.2
ActiveDirectoryServicePrincipal
- Так как драйвер версии 9.2 можно использовать для подключения к Azure SQL/Synapse Analytics,
authentication=ActiveDirectoryServicePrincipal
указав идентификатор приложения или клиента в свойстве userName и секрет удостоверения субъекта-службы в свойстве пароля. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryServicePrincipal".
- Так как драйвер версии 9.2 можно использовать для подключения к Azure SQL/Synapse Analytics,
ActiveDirectoryServicePrincipalCertificate
- Так как драйвер версии 12.4 можно использовать для подключения к База данных SQL Azure/Synapse Analytics,
authentication=ActiveDirectoryServicePrincipalCertificate
указав идентификатор приложения или клиента в свойстве userName и расположение сертификата субъекта-службы в свойствеclientCertificate
. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryServicePrincipalCertificate".
- Так как драйвер версии 12.4 можно использовать для подключения к База данных SQL Azure/Synapse Analytics,
SqlPassword
- Используйте
authentication=SqlPassword
для подключения к SQL Server с помощью свойств userName, user и password.
- Используйте
NotSpecified
- Используйте
authentication=NotSpecified
или оставьте значение по умолчанию, если ни один из этих методов проверки подлинности не требуется.
- Используйте
accessToken: используйте это свойство подключения для установки подключения к Базе данных SQL с помощью токена доступа.
accessToken
можно задать только с помощью параметраgetConnection()
Properties метода в классе DriverManager. Его нельзя использовать в URL-адресе подключения.
Дополнительные сведения об установке свойства authentication см. в статье Setting the connection properties (Установка свойств подключения).
Требования к настройке клиента
Помимо основных требований к системе драйверов, следующие режимы проверки подлинности имеют больше требований.
В следующей таблице перечислены необходимые зависимости библиотеки для каждого режима проверки подлинности и версии драйвера. Также требуются зависимости зависимостей.
Примечание.
В случаях, когда исправление для основного выпуска имеет другую версию зависимости, чем ее основной выпуск, также перечислены исправления.
Параметр проверки подлинности | Версии драйвера | Зависимости библиотеки |
---|---|---|
ActiveDirectoryPassword ActiveDirectoryIntegrated |
6,0 | Adal4j 1.3.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
6.2.2 - 6.4 | Adal4j 1.4.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
7.0 | Adal4j 1.6.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
7.2 | Adal4j 1.6.3Client-Runtime-for-AutoRest 1.6.5 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
7.4 - 8.2 | Adal4j l4j 1.6.4Client-Runtime-for-AutoRest 1.7.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
8.4 | Adal4j 1.6.5Client-Runtime-for-AutoRest 1.7.4 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
9,2 | msal4j 1.7.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
9,4 | msal4j 1.10.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
10.2 | msal4j 1.11.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
11.2 | msal4j 1.11.3 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
11.2.3 | msal4j 1.13.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
12,2 | msal4j 1.13.3 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12,2 | azure-identity 1.7.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12,4 | msal4j 1.13.8 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12,4 | azure-identity 1.9.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12,6 | msal4j 1.14.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12,6 | azure-identity 1.11.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.6.3 | msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.6.3 | azure-identity 1.12.2 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.6.4 | msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.6.4 | azure-identity 1.12.2 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12,8 | msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12,8 | azure-identity 1.12.2 |
Подключение с помощью режима проверки подлинности ActiveDirectoryManagedIdentity
Этот режим проверки подлинности поддерживается начиная с версии 7.2. Чтобы использовать его, укажите authentication=ActiveDirectoryMSI
. Начиная с версии 12.2 authentication=ActiveDirectoryManagedIdentity
, также можно указать.
Помимо требований зависимостей библиотеки, перечисленных в требованиях к настройке клиента, эта функция имеет следующие требования:
Целевая база данных должна иметь пользователя автономной базы данных с разрешением CONNECT. Автономный пользователь должен представлять управляемое удостоверение, назначенное системой ресурса Azure, или управляемое удостоверение, назначаемое пользователем, или одну из групп, к которым принадлежит управляемое удостоверение.
Клиентская среда должна быть ресурсом Azure и должна иметь поддержку функций Identity. В следующей таблице перечислены службы Azure, поддерживаемые каждой версией драйвера JDBC:
Версия драйвера Необходимые зависимости Поддерживаемые службы Azure 7.2 - 11.2 нет Служба приложений Azure и Функции Azure
Виртуальные машины Azure12,2
12,4
12,6
12,8azure-identity 1.7.0
azure-identity 1.9.0
azure-identity 1.11.1
azure-identity 1.12.2Служба приложений Azure и Функции Azure
Azure Arc
Azure Cloud Shell
Служба Azure Kubernetes
Azure Service Fabric
Виртуальные машины Azure
Масштабируемые наборы Виртуальные машины Azure
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryManagedIdentity
. Запустите этот пример из ресурса Azure, настроенного для управляемого удостоверения.
Чтобы запустить пример, замените имя сервера или базы данных именем сервера или базы данных в следующих строках:
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name
ds.setDatabaseName("demo"); // replace with your database name
//Optional
ds.setMSIClientId("<managed_identity_client>"); // Replace with Client ID of user-assigned managed identity to be used
Пример использования ActiveDirectoryMSI
режима проверки подлинности:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MsEntraMSI {
public static void main(String[] args) throws Exception {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database name
ds.setAuthentication("ActiveDirectoryMSI");
// Optional
ds.setMSIClientId("<managed_identity_client_guid>"); // Replace with Client ID of user-assigned managed identity to be used
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
В следующем примере показано, как использовать authentication=ActiveDirectoryManagedIdentity
режим.
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraManagedIdentity {
public static void main(String[] args) throws Exception {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database name
ds.setAuthentication("ActiveDirectoryManagedIdentity"); // ActiveDirectoryManagedIdentity for JDBC driver version v12.2.0+
// Optional
ds.setUser("<managed_identity_client>"); // Replace with Client ID of User-Assigned Managed Identity to be used
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
В этих примерах на виртуальной машине Azure извлекается маркер доступа из управляемого удостоверения, назначенного системой, или управляемого удостоверения пользователя (если msiClientId
или user
указан идентификатор клиента управляемого удостоверения) и устанавливается подключение с помощью маркера доступа, полученного с помощью маркера доступа. Если подключение установлено, отобразится следующее сообщение:
You have successfully logged on as: <your Managed Identity username>
Подключение с помощью режима проверки подлинности ActiveDirectoryDefault
Параметр ActiveDirectoryDefault
проверки подлинности использует прицеленную TokenCredential
реализацию клиентской библиотеки DefaultAzureCredential
удостоверений Azure. Учетные данные объединяют часто используемые методы проверки подлинности, связанные друг с другом.
ActiveDirectoryDefault
Для проверки подлинности требуется зависимость времени выполнения от клиентской библиотеки удостоверений Azure для управляемого удостоверения. Сведения о версии библиотеки см. в разделе "Требования к настройке клиента".
В следующей таблице перечислены цепочки DefaultAzureCredential
учетных данных для каждой версии драйвера JDBC.
Версия драйвера | Документация по версии azure identity | DefaultAzureCredential цепь |
---|---|---|
12,2 | azure-identity 1.7.0 | Среда Управляемое удостоверение IntelliJ Azure CLI Azure PowerShell |
12,4 | azure-identity 1.9.0 | Среда Удостоверение рабочей нагрузки Управляемое удостоверение Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
12,6 | azure-identity 1.11.1 | Среда Удостоверение рабочей нагрузки Управляемое удостоверение Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
12,8 | azure-identity 1.12.2 | Среда Удостоверение рабочей нагрузки Управляемое удостоверение Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
Существует множество переменных, которые можно задать для настройки учетных Environment
данных. Дополнительные сведения о настройке DefaulAzureCredential
цепочки, включая Environment
учетные данные, см. в соответствующей версии документации azure-identity, связанной в предыдущей таблице.
Чтобы использовать IntellijCredential
его в Windows, задайте переменную INTELLIJ_KEEPASS_PATH
среды в расположение keepass
файла. Например, INTELLIJ_KEEPASS_PATH=C:\user\your\path\to\the\keepass\file
.
Чтобы предоставить больше клиентов DefaultAzureCredential
в переменную среды, используйте ADDITIONALLY_ALLOWED_TENANTS
переменную среды. Эта переменная принимает список с разделителями-запятыми. Например: ADDITIONALLY_ALLOWED_TENANTS=<your-tenant-id-0>,<your-tenant-id-1>,<your-tenant-id-2>,...
В следующем примере показано, как использовать authentication=ActiveDirectoryDefault
режим с AzureCliCredential в пределах.DefaultAzureCredential
Сначала войдите в Azure CLI с помощью следующей команды.
az login
После успешного входа в Azure CLI выполните следующий код.
import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import com.microsoft.sqlserver.jdbc.SQLServerDataSource; public class MSEntraDefault { public static void main(String[] args) throws Exception { SQLServerDataSource ds = new SQLServerDataSource(); ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name ds.setDatabaseName("demo"); // Replace with your database name ds.setAuthentication("ActiveDirectoryDefault"); try (Connection connection = ds.getConnection(); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) { if (rs.next()) { System.out.println("You have successfully logged on as: " + rs.getString(1)); } } } }
Установка подключения с использованием режима проверки подлинности ActiveDirectoryIntegrated
Существует два способа использования ActiveDirectoryIntegrated
проверки подлинности в драйвере Microsoft JDBC для SQL Server:
- В Windows
mssql-jdbc_auth-<version>-<arch>.dll
скачанный пакет можно скопировать в расположение в системном пути. - Если нет возможности использовать библиотеку DLL, то начиная с версии 6.4 можно настроить билет Kerberos. Этот метод поддерживается на разных платформах (Windows, Linux и macOS). Дополнительные сведения см. в разделе Настройка билета Kerberos в Windows, Linux и macOS.
Убедитесь, что у вас есть необходимые зависимые библиотеки от требований к настройке клиента.
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryIntegrated
. В этом примере выполняется компьютер, присоединенный к домену, который федеративный с идентификатором Microsoft Entra. Пользователь базы данных, представляющий пользователя Windows, должен существовать в базе данных и иметь разрешение CONNECT.
Перед выполнением примера замените имена сервера и базы данных именами ваших сервера и базы данных в следующих строках:
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name
ds.setDatabaseName("demo"); // replace with your database name
Пример использования режима проверки подлинности ActiveDirectoryIntegrated:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraIntegrated {
public static void main(String[] args) throws Exception {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database name
ds.setAuthentication("ActiveDirectoryIntegrated");
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
В этом примере автоматически используется билет Kerberos на клиентской платформе и пароль не требуется. Если подключение установлено, отобразится следующее сообщение:
You have successfully logged on as: <your domain user name>
Настройка билета Kerberos в Windows, Linux и macOS
Вам необходимо настроить билет Kerberos, связывающий текущего пользователя с учетной записью домена Windows. Ниже приведены краткие сведения о ключевых шагах.
Windows
Примечание.
В Windows mssql-jdbc_auth-<version>-<arch>.dll
скачанный пакет можно использовать вместо этих шагов конфигурации Kerberos. Эти действия требуется выполнять только в том случае, если нет возможности использовать библиотеку DLL.
JDK поставляется с kinit
пакетом управления , с помощью которого можно получить TGT из центра распространения ключей (KDC) на присоединенном к домену компьютере, федеративном с идентификатором Microsoft Entra.
Шаг 1. Получение билета
Запуск в: Windows
Действие:
- Выполните команду
kinit username@DOMAIN.COMPANY.COM
, чтобы получить TGT из KDC, и появится запрос на пароль вашего домена. - Выполните команду
klist
, чтобы просмотреть доступные билеты. Если kinit был успешным, вы должны увидеть билет изkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
Примечание.
Чтобы приложение нашло KDC, может потребоваться указать файл
.ini
с-Djava.security.krb5.conf
.- Выполните команду
Linux и macOS
Требования
Доступ к компьютеру, присоединенному к домену Windows, для обращения к контроллеру домена Kerberos.
Шаг 1. Поиск KDC Kerberos
Запуск: командная строка Windows
Действие:
nltest /dsgetdc:DOMAIN.COMPANY.COM
(гдеDOMAIN.COMPANY.COM
сопоставляется с именем домена)Образец вывода
DC: \\co1-red-dc-33.domain.company.com Address: \\2111:4444:2111:33:1111:ecff:ffff:3333 ... The command completed successfully
Информация для извлечения: доменное имя, в данном случае —
co1-red-dc-33.domain.company.com
.
Шаг 2. Настройка KDC в krb5.conf
Запуск: Linux или macOS
Действие. Изменение
/etc/krb5.conf
выбранного редактора. Настройте следующие ключи.[libdefaults] default_realm = DOMAIN.COMPANY.COM [realms] DOMAIN.COMPANY.COM = { kdc = co1-red-dc-28.domain.company.com }
Затем сохраните
krb5.conf
файл и закройте его.Примечание.
Домен должен быть указан прописными буквами.
Шаг 3. Тестирование извлечения билета на получение билетов
- Запуск: Linux или macOS
- Действие:
- Выполните команду
kinit username@DOMAIN.COMPANY.COM
, чтобы получить TGT из KDC, и появится запрос на пароль вашего домена. - Выполните команду
klist
, чтобы просмотреть доступные билеты. Если kinit был успешным, вы должны увидеть билет изkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
- Выполните команду
Установка подключения с использованием режима проверки подлинности ActiveDirectoryPassword
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryPassword
.
Сборка и запуск примера
Убедитесь, что у вас есть необходимые зависимые библиотеки от требований к настройке клиента.
Найдите приведенные ниже строки кода и замените имена сервера и базы данных именами своих сервера и базы данных.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Найдите приведенные ниже строки кода. Замените имя пользователя именем пользователя Microsoft Entra, который вы хотите подключить как.
ds.setUser("bob@example.com"); // replace with your username ds.setPassword("password"); // replace with your password
Пример использования ActiveDirectoryPassword
режима проверки подлинности:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraUserPassword {
public static void main(String[] args) throws Exception{
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database
ds.setUser("bob@example.com"); // Replace with your username
ds.setPassword("password"); // Replace with your password
ds.setAuthentication("ActiveDirectoryPassword");
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если установлено подключение, вы увидите следующее сообщение в виде выходных данных:
You have successfully logged on as: <your user name>
Установка подключения с использованием режима проверки подлинности ActiveDirectoryInteractive
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryInteractive
.
Сборка и запуск примера
Убедитесь, что у вас есть необходимые зависимые библиотеки от требований к настройке клиента.
Найдите приведенные ниже строки кода и замените имена сервера и базы данных именами своих сервера и базы данных.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Найдите приведенные ниже строки кода. Замените имя пользователя Microsoft Entra, который вы хотите подключить как.
ds.setUser("bob@example.com"); // replace with your username
Пример использования ActiveDirectoryInteractive
режима проверки подлинности:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraInteractive {
public static void main(String[] args) throws Exception{
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database
ds.setAuthentication("ActiveDirectoryInteractive");
// Optional login hint
ds.setUser("bob@example.com"); // Replace with your user name
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
При запуске программы отображается окно браузера, в котором выполняется проверка подлинности пользователя. Точно то, что вы видите, зависит от настройки идентификатора Microsoft Entra. Он может включать или не включать многофакторную проверку подлинности для имени пользователя, пароля, ПИН-кода или второй проверки подлинности устройства через телефон. Когда в одной программе выполняется несколько интерактивных запросов проверки подлинности, пользователь может даже не получать последующие запросы, если библиотека проверки подлинности может повторно использовать ранее кэшированный маркер.
Сведения о настройке идентификатора Microsoft Entra для многофакторной проверки подлинности см. в статье "Начало работы с многофакторной проверкой подлинности Microsoft Entra" в облаке.
Снимок экрана этих диалоговых окон см. в разделе "Использование многофакторной проверки подлинности Microsoft Entra".
Если проверка подлинности пользователя успешно завершена, в браузере должно появиться следующее сообщение.
Authentication complete. You can close the browser and return to the application.
Оно означает лишь то, что проверка подлинности пройдена успешно, но необязательно то, что соединение с сервером установлено. Если подключение к серверу установлено, вернувшись в приложение, вы должны увидеть следующее сообщение.
You have successfully logged on as: <your user name>
Установка подключения с использованием режима проверки подлинности ActiveDirectoryServicePrincipal
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryServicePrincipal
.
Сборка и запуск примера
Убедитесь, что у вас есть необходимые зависимые библиотеки от требований к настройке клиента.
Найдите приведенные ниже строки кода и замените имена сервера и базы данных именами своих сервера и базы данных.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Найдите приведенные ниже строки кода. Замените значение
principalId
идентификатором приложения или идентификатором клиента субъекта-службы Microsoft Entra, который требуется подключить как. Замените значениеprincipalSecret
на секрет.String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID. String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
Задайте идентификатор субъекта и секрет субъекта с помощью и
setPassword
вsetUser
версии 10.2 и выше, аsetAADSecurePrincipalId
такжеsetAADSecurePrincipalSecret
в версии 9.4 и ниже.
Пример использования ActiveDirectoryServicePrincipal
режима проверки подлинности:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraServicePrincipal {
public static void main(String[] args) throws Exception{
String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID.
String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database
ds.setAuthentication("ActiveDirectoryServicePrincipal");
ds.setUser(principalId); // setAADSecurePrincipalId for JDBC Driver 9.4 and below
ds.setPassword(principalSecret); // setAADSecurePrincipalSecret for JDBC Driver 9.4 and below
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если подключение установлено успешно, отобразится следующее сообщение.
You have successfully logged on as: <your app/client ID>
Подключение с помощью режима проверки подлинности ActiveDirectoryServicePrincipalCertificate
Следующий пример иллюстрирует использование режима authentication=ActiveDirectoryServicePrincipalCertificate
.
Сборка и запуск примера
Убедитесь, что у вас есть необходимые зависимые библиотеки от требований к настройке клиента.
Найдите приведенные ниже строки кода и замените имена сервера и базы данных именами своих сервера и базы данных.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Найдите приведенные ниже строки кода. Замените значение
principalId
идентификатором приложения или идентификатором клиента субъекта-службы Microsoft Entra, который требуется подключить как. Замените значениеclientCertificate
расположения сертификата субъекта-службы.String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID. String clientCertificate = "..."; // Replace with the location for your Microsoft Entra service principal certificate.
Если упомянутый ранее сертификат нуждается в пароле, задайте основной секрет, используя его
setPassword
в версии 10.2 и выше илиsetAADSecurePrincipalSecret
в версии 9.4 и ниже.Если сертификат имеет связанный закрытый ключ, задайте закрытый ключ с помощью
setClientKey
. Если для этого ключа требуется пароль, задайте пароль для закрытого ключа с помощьюsetClientKeyPassword
.
Пример использования ActiveDirectoryServicePrincipalCertificate
режима проверки подлинности:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class MSEntraServicePrincipalCertificate {
public static void main(String[] args) throws Exception{
String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID.
String clientCertificate = "..."; // Replace with the location of your service principal certificate.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("demo"); // Replace with your database
ds.setAuthentication("ActiveDirectoryServicePrincipalCertificate");
ds.setUser(principalId); // setAADSecurePrincipalId for JDBC Driver 9.4 and below
ds.setClientCertificate(clientCertificate);
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если подключение установлено успешно, отобразится следующее сообщение.
You have successfully logged on as: <your app/client ID>
Подключение с помощью токена доступа.
Приложения и службы могут получить маркер доступа из идентификатора Microsoft Entra и использовать его для подключения к База данных SQL Azure, Управляемый экземпляр SQL Azure и Azure Synapse Analytics.
Примечание.
accessToken
можно задать только с помощью параметра getConnection()
Properties метода в классе DriverManager. Его нельзя использовать в строке подключения. Начиная с драйвера версии 12.2 пользователи могут реализовывать и предоставлять обратный accessToken
вызов драйверу для продления маркеров в сценариях пула подключений. Для сценариев пула подключений требуется реализация пула подключений для использования стандартных классов пула подключений JDBC.
В следующем примере содержится простое приложение Java, которое подключается к Azure с помощью проверки подлинности на основе маркеров доступа.
Сборка и запуск примера
Создайте учетную запись приложения в идентификаторе Microsoft Entra для службы.
- Войдите на портал Azure.
- Перейдите к идентификатору Microsoft Entra в области навигации слева.
- Щелкните Регистрация приложений.
- Выберите Создать регистрацию.
- Введите
mytokentest
понятное имя приложения. - Оставьте выбор по умолчанию для поддерживаемых типов учетных записей, которые могут использовать приложение.
- Выберите " Зарегистрировать " в нижней части экрана.
- Не требуется URL-адрес входа. Укажите что-нибудь:
https://mytokentest
- Выберите
Create
внизу. - После выбора регистрации приложение сразу же создается и вы перейдете на страницу ресурсов.
- В поле Essentials найдите идентификатор приложения (клиента) и скопируйте его. Это значение потребуется позже для настройки приложения.
- Выберите сертификаты и секреты в области навигации. На вкладке секреты клиента (0) выберите новый секрет клиента. Введите описание секрета и выберите срок действия (по умолчанию это нормально). Выберите " Добавить " внизу. Важно перед выходом из этой страницы скопировать созданное значение для секрета клиента. Это значение нельзя просмотреть после выхода страницы. Это значение является секретом клиента.
- Вернитесь к области Регистрация приложений идентификатора Microsoft Entra и найдите вкладку "Конечные точки". Скопируйте URL-адрес в разделе
OAuth 2.0 token endpoint
. Этот URL-адрес — это URL-адрес STS.
Подключитесь к базе данных в качестве администратора Microsoft Entra и используйте команду T-SQL для подготовки пользователя автономной базы данных для субъекта приложения. Дополнительные сведения о создании администратора Microsoft Entra и пользователя автономной базы данных см. в разделе "Подключение с помощью проверки подлинности Microsoft Entra".
CREATE USER [mytokentest] FROM EXTERNAL PROVIDER
На клиентском компьютере, где выполняется пример, скачайте библиотеку проверки подлинности Майкрософт (MSAL) для библиотеки Java и ее зависимости. MSAL требуется только для выполнения этого конкретного примера. В примере используются API из этой библиотеки для получения маркера доступа из идентификатора Microsoft Entra. Если у вас уже есть маркер доступа, этот шаг можно пропустить и удалить из примера раздел, который извлекает маркер доступа.
В приведенном ниже примере замените собственными значениями URL-адрес службы токенов безопасности, идентификатор клиента, секрет клиента, имя сервера и базы данных.
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
// The microsoft-authentication-library-for-java is needed to retrieve the access token in this example.
import com.microsoft.aad.msal4j.ClientCredentialFactory;
import com.microsoft.aad.msal4j.ClientCredentialParameters;
import com.microsoft.aad.msal4j.ConfidentialClientApplication;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.IClientCredential;
public class MSEntraTokenBased {
public static void main(String[] args) throws Exception {
// Retrieve the access token from Microsoft Entra ID.
String spn = "https://database.windows.net/";
String stsurl = "https://login.microsoftonline.com/..."; // Replace with your STS URL.
String clientId = "<service_principal_guid>"; // Replace with your client ID.
String clientSecret = "..."; // Replace with your client secret.
String scope = spn + "/.default";
Set<String> scopes = new HashSet<>();
scopes.add(scope);
ExecutorService executorService = Executors.newSingleThreadExecutor();
IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
ConfidentialClientApplication clientApplication = ConfidentialClientApplication
.builder(clientId, credential).executorService(executorService).authority(stsurl).build();
CompletableFuture<IAuthenticationResult> future = clientApplication
.acquireToken(ClientCredentialParameters.builder(scopes).build());
IAuthenticationResult authenticationResult = future.get();
String accessToken = authenticationResult.accessToken();
System.out.println("Access Token: " + accessToken);
// Connect with the access token.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replace with your server name.
ds.setDatabaseName("demo"); // Replace with your database name.
ds.setAccessToken(accessToken);
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если подключение установлено успешно, отобразится следующее сообщение:
Access Token: <your access token>
You have successfully logged on as: <your client ID>
Подключение с помощью обратного вызова маркера доступа
Как и свойство маркера доступа, обратный вызов маркера доступа позволяет зарегистрировать метод, предоставляющий маркер доступа драйверу. Преимуществом этого обратного вызова по сравнению со свойством является обратный вызов, позволяющий драйверу запрашивать новый маркер доступа при истечении срока действия маркера. Например, пул соединений, создающий новое подключение, может запросить новый маркер с новой датой окончания срока действия. Дополнительные сведения см. в разделе "Использование пула подключений".
В следующем примере демонстрируется реализация и настройка обратного вызова accessToken.
import com.microsoft.aad.msal4j.IClientCredential;
import com.microsoft.aad.msal4j.ClientCredentialFactory;
import com.microsoft.aad.msal4j.ConfidentialClientApplication;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.ClientCredentialParameters;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MSEntraAccessTokenCallback {
public static void main(String[] args) {
SQLServerAccessTokenCallback callback = new SQLServerAccessTokenCallback() {
@Override
public SqlAuthenticationToken getAccessToken(String spn, String stsurl) {
String clientSecret = "..."; // Replace with your client secret.
String clientId = "<service_principal_guid>"; // Replace with your client ID.
String scope = spn + "/.default";
Set<String> scopes = new HashSet<>();
scopes.add(scope);
try {
ExecutorService executorService = Executors.newSingleThreadExecutor();
IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
ConfidentialClientApplication clientApplication = ConfidentialClientApplication
.builder(clientId, credential).executorService(executorService).authority(stsurl).build();
CompletableFuture<IAuthenticationResult> future = clientApplication
.acquireToken(ClientCredentialParameters.builder(scopes).build());
IAuthenticationResult authenticationResult = future.get();
String accessToken = authenticationResult.accessToken();
return new SqlAuthenticationToken(accessToken, authenticationResult.expiresOnDate().getTime());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replaces with your server name.
ds.setDatabaseName("demo"); // Replace with your database name.
ds.setAccessTokenCallback(callback);
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если подключение установлено успешно, отобразится следующее сообщение:
You have successfully logged on as: <your client ID>
Начиная с версии 12.4 accessToken
обратный accessTokenCallbackClass
вызов можно задать с помощью свойства строка подключения. В следующем примере показано, как задать обратный accessToken
вызов с помощью этого свойства:
import com.microsoft.aad.msal4j.IClientCredential;
import com.microsoft.aad.msal4j.ClientCredentialFactory;
import com.microsoft.aad.msal4j.ConfidentialClientApplication;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.ClientCredentialParameters;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MSEntraAccessTokenCallbackClass {
public static class AccessTokenCallbackClass implements SQLServerAccessTokenCallback {
@Override
public SqlAuthenticationToken getAccessToken(String spn, String stsurl) {
String clientSecret = "..."; // Replace with your client secret.
String clientId = "<service_principal_guid>"; // Replace with your client ID.
String scope = spn + "/.default";
Set<String> scopes = new HashSet<>();
scopes.add(scope);
try {
ExecutorService executorService = Executors.newSingleThreadExecutor();
IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
ConfidentialClientApplication clientApplication = ConfidentialClientApplication
.builder(clientId, credential).executorService(executorService).authority(stsurl).build();
CompletableFuture<IAuthenticationResult> future = clientApplication
.acquireToken(ClientCredentialParameters.builder(scopes).build());
IAuthenticationResult authenticationResult = future.get();
String accessToken = authenticationResult.accessToken();
return new SqlAuthenticationToken(accessToken, authenticationResult.expiresOnDate().getTime());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) throws Exception {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("msentra-managed-demo.database.windows.net"); // Replaces with your server name.
ds.setDatabaseName("demo"); // Replace with your database name.
ds.setAccessTokenCallbackClass(AccessTokenCallbackClass.class.getName());
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
System.out.println("You have successfully logged on as: " + rs.getString(1));
}
}
}
}
Если подключение установлено успешно, отобразится следующее сообщение:
You have successfully logged on as: <your client ID>
Следующие шаги
Дополнительные сведения о связанных понятиях см. в следующих статьях: