Подключение с помощью проверки подлинности Microsoft Entra
В этой статье содержатся сведения о разработке приложений Java, использующих функцию проверки подлинности Microsoft Entra с драйвером Microsoft JDBC для SQL Server.
Вы можете использовать проверку подлинности Microsoft Entra, которая является механизмом подключения к базе данных Azure SQL, управляемому экземпляру Azure SQL и Azure Synapse Analytics с помощью идентификаторов Microsoft Entra ID. Используйте проверку подлинности 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.2,authentication=ActiveDirectoryManagedIdentity
можно также использовать для подключения к базе данных Azure SQL/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 Federation Services (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,
authentication=ActiveDirectoryServicePrincipal
можно использовать для подключения к Azure SQL/Synapse Analytics, указав идентификатор приложения или клиента в свойстве userName и секрет удостоверения основной сущности службы в свойстве password. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryServicePrincipal".
- Начиная с версии драйвера 9.2,
Сертификат главного компонента службы Active Directory
- Начиная с версии драйвера 12.4,
authentication=ActiveDirectoryServicePrincipalCertificate
можно использовать для подключения к базе данных SQL Azure/Synapse Analytics, указав идентификатор приложения/клиента в свойстве userName и расположение сертификата субъекта-службы в свойствеclientCertificate
. Дополнительные сведения см. в разделе "Подключение с помощью режима проверки подлинности ActiveDirectoryServicePrincipalCertificate".
- Начиная с версии драйвера 12.4,
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 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.10 |
azure-identity 1.15.3 |
Подключение с помощью режима проверки подлинности 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,8
12.10azure-identity
1.7.0
azure-identity
1.9.0
azure-identity
1.11.1
azure-identity
1.12.2
azure-identity
1.15.3Служба приложений 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
аутентификации использует цепную реализацию клиентской библиотеки удостоверений 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 |
12.10 |
azure-identity 1.15.3 |
Окружающая среда Идентификация рабочей нагрузки Управляемая идентичность CLI разработчика Azure IntelliJ Azure CLI Azure PowerShell |
Существует множество переменных, которые можно задать для настройки учетных Environment
данных. Дополнительные сведения о настройке DefaultAzureCredential
цепочки, включая 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 ID. Пользователь базы данных, представляющий пользователя 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 ID.
Шаг 1. Получение билета
Работает на: Windows
Действие:
- Выполните команду
kinit username@DOMAIN.COMPANY.COM
, чтобы получить TGT из KDC, и появится запрос на пароль вашего домена. - Выполните команду
klist
, чтобы просмотреть доступные билеты. Если kinit был успешным, вы должны получить билет отkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
Примечание.
Вам может потребоваться указать файл
.ini
с-Djava.security.krb5.conf
, чтобы ваше приложение смогло найти KDC.- Выполните команду
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
Найдите приведенные ниже строки кода. Замените username на имя пользователя 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.
Задайте идентификатор субъекта и секрет субъекта с помощью
setUser
иsetPassword
в версии 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 ID и использовать его для подключения к базе данных SQL Azure, управляемому экземпляру SQL Azure и Azure Synapse Analytics.
Примечание.
accessToken
можно задать только с помощью параметра getConnection()
Properties метода в классе DriverManager. Его нельзя использовать в строке подключения. Начиная с версии 12.2, пользователи могут реализовывать и предоставлять обратный accessToken
вызов драйверу для продления токенов в сценариях подключения к пулу. Для сценариев пула подключений требуется реализация пула подключений для использования стандартных классов пула подключений JDBC.
В следующем примере содержится простое приложение Java, которое подключается к Azure с помощью проверки подлинности на основе маркеров доступа.
Сборка и запуск примера
Создайте учетную запись приложения в Microsoft Entra ID для вашей службы.
- Войдите на портал Azure.
- Перейдите к Microsoft Entra ID в левой навигационной панели.
- Щелкните Регистрация приложений.
- Выберите Создать регистрацию.
- Введите
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 ID. Если у вас уже есть маркер доступа, этот шаг можно пропустить и удалить из примера раздел, который извлекает маркер доступа.
В приведенном ниже примере замените собственными значениями 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>
Следующие шаги
Дополнительные сведения о связанных понятиях см. в следующих статьях: