Připojení pomocí ověřování Microsoft Entra
Tento článek obsahuje informace o tom, jak vyvíjet aplikace Java, které používají funkci ověřování Microsoft Entra s ovladačem Microsoft JDBC pro SQL Server.
Můžete použít ověřování Microsoft Entra, což je mechanismus pro připojení ke službě Azure SQL Database, azure SQL Manged Instance a Azure Synapse Analytics pomocí identit v Microsoft Entra ID. Ověřování Microsoft Entra slouží k centrální správě identit uživatelů databáze a jako alternativy k ověřování SQL Serveru. Ovladač JDBC umožňuje zadat přihlašovací údaje Microsoft Entra v připojovacím řetězci JDBC pro připojení k Azure SQL. Informace o konfiguraci ověřování Microsoft Entra naleznete v tématu Připojení k Azure SQL pomocí ověřování Microsoft Entra.
Vlastnosti připojení pro podporu ověřování Microsoft Entra v ovladači Microsoft JDBC pro SQL Server jsou:
-
Ověřování: Použijte tuto vlastnost k určení metody ověřování SQL, kterou použijete pro připojení.
Možné hodnoty:
Spravovaná identita Active Directory
- Od verze ovladače 8.3.1 lze
authentication=ActiveDirectoryMSI
použít k připojení k Azure SQL databázi/Synapse Analytics z prostředku Azure s podporou Identity. Volitelně můžete msiClientId zadat ve vlastnostech připojení nebo zdroje dat spolu s tímto režimem ověřování.msiClientId
musí obsahovat ID klienta spravované identity, které se má použít k získání accessToken pro navázání připojení. Od verze ovladače 12.2 lzeauthentication=ActiveDirectoryManagedIdentity
také použít k připojení k databázi Azure SQL Database/Synapse Analytics z prostředku Azure s povolenou podporou "Identity". Volitelně můžete ID klienta spravované identity nastavit také ve vlastnostiuser
. Další informace naleznete v tématu Připojení pomocí režimu ověřování na základě identity spravované Active Directory.
- Od verze ovladače 8.3.1 lze
ActiveDirectoryDefault
- Od verze ovladače 12.2 lze
authentication=ActiveDirectoryDefault
použít k připojení k Azure SQL/Synapse Analytics prostřednictvím DefaultAzureCredential z klientské knihovny Azure Identity. Další informace najdete v tématu Připojení pomocí autentizačního režimu ActiveDirectoryDefault.
- Od verze ovladače 12.2 lze
ActiveDirectoryIntegrated
- Od verze ovladače 6.0 lze
authentication=ActiveDirectoryIntegrated
použít k připojení k Azure SQL/Synapse Analytics prostřednictvím integrovaného ověřování. Pokud chcete použít tento režim ověřování, musíte federovat místní službu Active Directory Federation Services (ADFS) s ID Microsoft Entra v cloudu. Jakmile ho nastavíte, můžete se připojit buď přidáním nativní knihovnymssql-jdbc_auth-<version>-<arch>.dll
do cesty třídy aplikace ve Windows, nebo nastavením lístku Kerberos pro podporu ověřování napříč platformami. Máte přístup k Azure SQL nebo Azure Synapse Analytics bez výzvy k zadání přihlašovacích údajů při přihlášení k počítači připojenému k doméně. Další informace naleznete v Connect pomocí režimu ověřování ActiveDirectoryIntegrated.
- Od verze ovladače 6.0 lze
ActiveDirectoryPassword
- Od verze ovladače 6.0 můžete
authentication=ActiveDirectoryPassword
použít k připojení k Azure SQL/Synapse Analytics pomocí uživatelských údajů Microsoft Entra. Pro více informací si přečtěte téma Připojení pomocí ověřovacího režimu ActiveDirectoryPassword.
- Od verze ovladače 6.0 můžete
Interaktivní služba Active Directory
- Od verze ovladače 9.2 je možné použít
authentication=ActiveDirectoryInteractive
k připojení k Azure SQL/Synapse Analytics prostřednictvím interaktivního ověřovacího toku, který využívá vícefaktorové ověřování. Další informace naleznete v části Připojení pomocí režimu ověřování ActiveDirectoryInteractive.
- Od verze ovladače 9.2 je možné použít
ActiveDirectoryServicePrincipal
- Od verze ovladače 9.2 lze
authentication=ActiveDirectoryServicePrincipal
použít k připojení k Azure SQL/Synapse Analytics zadáním ID aplikace/klienta ve vlastnosti userName a tajného klíče identity služebního principála ve vlastnosti hesla. Další informace najdete v tématu Připojení pomocí ověřovacího módu ActiveDirectoryServicePrincipal.
- Od verze ovladače 9.2 lze
CertifikátHlavníSlužbyActiveDirectory
- Od verze ovladače 12.4 lze
authentication=ActiveDirectoryServicePrincipalCertificate
použít k připojení k Azure SQL Database/Synapse Analytics zadáním ID aplikace/klienta ve vlastnosti userName a umístěním certifikátu hlavního objektu služby ve vlastnosticlientCertificate
. Další informace najdete v tématu Connect pomocí režimu ověřování ActiveDirectoryServicePrincipalCertificate.
- Od verze ovladače 12.4 lze
SqlPassword
- Pomocí
authentication=SqlPassword
se připojte k SQL Serveru pomocí vlastností userName/user a password.
- Pomocí
Neurčeno
- Použijte
authentication=NotSpecified
nebo ho ponechte jako výchozí, pokud nejsou potřeba žádné z těchto metod ověřování.
- Použijte
accessToken: Pomocí této vlastnosti připojení se připojte ke službě SQL Database s přístupovým tokenem.
accessToken
lze nastavit pouze pomocí parametru Properties metodygetConnection()
ve třídě DriverManager. Nejde ho použít v adrese URL připojení.
Další informace naleznete v části Ověřovací vlastnost na stránce Nastavení vlastností připojení.
Požadavky na nastavení klienta
Kromě základního ovladače a systémových požadavkůmají následující režimy ověřování další požadavky.
Následující tabulka uvádí požadované závislosti knihovny pro každý režim ověřování a verzi ovladače. Vyžadují se také závislosti závislostí.
Poznámka
V případech, kdy oprava hotfix pro hlavní verzi má jinou verzi závislosti než její hlavní verze, je také uvedena oprava.
Možnost ověřování | Verze ovladačů | Závislosti knihoven |
---|---|---|
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 |
Připojení pomocí režimu ověřování ActiveDirectoryManagedIdentity
Tento režim ověřování se podporuje od verze 7.2. Chcete-li jej použít, zadejte authentication=ActiveDirectoryMSI
. Počínaje verzí 12.2 je možné zadat také authentication=ActiveDirectoryManagedIdentity
.
Kromě požadavků na závislost knihovny uvedených v Požadavky na nastavení klientamá tato funkce následující požadavky:
Cílová databáze musí mít uživatele omezené databáze s oprávněním k připojení. Uvedený uživatel musí představovat spravovanou identitu přiřazenou systémem vaší Azure Resource, spravovanou identitu přiřazenou uživatelem, nebo musí být součástí některé z těch skupin, do kterých vaše spravovaná identita patří.
Klientské prostředí musí být prostředek Azure a musí mít povolenou podporu funkce Identita. Následující tabulka uvádí služby Azure podporované každou verzí ovladače JDBC:
Verze ovladače Požadované závislosti Podporované služby Azure 7.2 - 11.2 Žádný Azure App Service a Azure Functions
Azure virtuální počítače12.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.3Azure App Service a Azure Funkce
Azure Arc
Azure Cloud Shell
azure Kubernetes Service
Azure Service Fabric
virtuálních počítačů Azure
škálovací sady virtuálních počítačů Azure
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryManagedIdentity
. Spusťte tento příklad z prostředku Azure, který je nakonfigurovaný pro spravovanou identitu.
Pokud chcete spustit příklad, nahraďte název serveru nebo databáze názvem serveru nebo databáze na následujících řádcích:
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
Příklad použití režimu ověřování 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));
}
}
}
}
Následující příklad ukazuje použití authentication=ActiveDirectoryManagedIdentity
režimu.
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));
}
}
}
}
Tyto příklady na virtuálním počítači Azure načítají přístupový token z spravované identity přiřazené systémem nebo spravované identity přiřazené uživatelem (pokud je msiClientId
nebo user
zadána s ID klienta spravované identity) a vytvoří připojení pomocí načteného přístupového tokenu. Pokud je připojení navázáno, měla by se zobrazit následující zpráva:
You have successfully logged on as: <your Managed Identity username>
Připojení pomocí režimu ověřování ActiveDirectoryDefault
Možnost ověřování ActiveDirectoryDefault
používá zřetězenou implementaci knihovny klienta Azure Identity DefaultAzureCredential
TokenCredential
. Přihlašovací údaje kombinují běžně používané metody ověřování, které jsou propojeny dohromady.
ActiveDirectoryDefault
ověřování vyžaduje běhovou závislost na knihovně klienta Azure Identity pro správu identit. Podrobnosti o verzi knihovny najdete v tématu Požadavky na nastavení klienta.
Následující tabulka uvádí DefaultAzureCredential
řetěz přihlašovacích údajů pro každou verzi ovladače JDBC.
Verze ovladače | Azure-identity verze | řetězec DefaultAzureCredential |
---|---|---|
12.2 |
azure-identity 1.7.0 |
Životní prostředí Spravovaná identita IntelliJ Azure CLI Azure PowerShell |
12.4 |
azure-identity 1.9.0 |
Životní prostředí Identita úloh Spravovaná identita Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
12.6 |
azure-identity 1.11.1 |
Životní prostředí Identita úloh Spravovaná identita Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
12.8 |
azure-identity 1.12.2 |
Životní prostředí Identita úloh Spravovaná identita Azure Developer CLI IntelliJ Azure CLI Azure PowerShell |
12.10 |
azure-identity 1.15.3 |
Životní prostředí Identita úloh Spravovaná identita CLI pro vývojáře na Azure IntelliJ Azure CLI Azure PowerShell |
Existuje mnoho proměnných, které je možné nastavit pro konfiguraci Environment
přihlašovacích údajů. Podrobnosti o konfiguraci řetězu DefaultAzureCredential
, včetně přihlašovacích údajů Environment
, najdete v příslušné verzi dokumentace azure-identity propojené v předchozí tabulce.
Pokud chcete použít IntellijCredential
ve Windows, nastavte proměnnou prostředí INTELLIJ_KEEPASS_PATH
na umístění souboru keepass
. Například INTELLIJ_KEEPASS_PATH=C:\user\your\path\to\the\keepass\file
.
Pro zajištění více tenantů pro DefaultAzureCredential
použijte proměnnou prostředí ADDITIONALLY_ALLOWED_TENANTS
. Tato proměnná přebírá čárkami oddělený seznam. Například ADDITIONALLY_ALLOWED_TENANTS=<your-tenant-id-0>,<your-tenant-id-1>,<your-tenant-id-2>,...
Následující příklad demonstruje, jak používat režim authentication=ActiveDirectoryDefault
s AzureCliCredential v prostředí DefaultAzureCredential
.
Nejdřív se přihlaste k Azure CLI pomocí následujícího příkazu.
az login
Po úspěšném přihlášení k Azure CLI spusťte následující kód.
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)); } } } }
Připojte se pomocí režimu ověřování ActiveDirectoryIntegrated
Ověřování ActiveDirectoryIntegrated
v ovladači Microsoft JDBC pro SQL Server můžete použít dvěma způsoby:
- Ve Windows lze
mssql-jdbc_auth-<version>-<arch>.dll
, který je součástí staženého balíčku , zkopírovat do složky v systémové cestě. - Pokud nemůžete knihovnu DLL používat, od verze 6.4 můžete nakonfigurovat lístek Kerberos. Tato metoda se podporuje napříč platformami (Windows, Linux a macOS). Další informace najdete v tématu Nastavení lístku Kerberos ve Windows, Linuxu a macOS.
Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryIntegrated
. Tento příklad běží na počítači připojeném k doméně, který je federovaný s ID Microsoft Entra. Uživatel databáze, který představuje uživatele systému Windows, musí existovat v databázi a musí mít oprávnění CONNECT.
Před spuštěním příkladu nahraďte název serveru nebo databáze názvem serveru nebo databáze na následujících řádcích:
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name
ds.setDatabaseName("demo"); // replace with your database name
Příklad použití režimu ověřování 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));
}
}
}
}
Spuštění tohoto příkladu automaticky používá lístek Kerberos z klientské platformy a nevyžaduje se žádné heslo. Pokud je připojení navázáno, měla by se zobrazit následující zpráva:
You have successfully logged on as: <your domain user name>
Nastavení lístku Kerberos ve Windows, Linuxu a macOS
Pokud chcete propojit aktuálního uživatele s účtem domény Systému Windows, musíte vytvořit lístek Kerberos. Následuje souhrn klíčových kroků.
Windows
Poznámka
Ve Windows je možné místo těchto kroků konfigurace protokolu Kerberos použít mssql-jdbc_auth-<version>-<arch>.dll
ze staženého balíčku . Tyto kroky se vyžadují jenom v případě, že knihovnu DLL nemůžete použít.
Sada JDK se dodává s kinit
, který můžete použít k získání TGT z centra distribuce klíčů (KDC) na počítači připojeném k doméně, který je federovaný s Microsoft Entra ID.
Krok 1: Získání vstupního udělovacího lístku
Spustit na: Windows
akce:
- Pomocí příkazu
kinit username@DOMAIN.COMPANY.COM
získáte TGT z KDC a pak vás vyzve k zadání hesla k doméně. - K zobrazení dostupných lístků použijte
klist
. Pokud byl kinit úspěšný, měli byste vidět lístek zkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
Poznámka
Možná budete muset zadat soubor
.ini
s-Djava.security.krb5.conf
pro vaši aplikaci, abyste našli KDC.- Pomocí příkazu
Linux a macOS
Požadavky
Přístup k počítači připojenému k doméně Windows pro dotazování řadiče domény Kerberos.
Krok 1: Vyhledání KDC protokolu Kerberos
Spustit na: příkazový řádek Windows
akce:
nltest /dsgetdc:DOMAIN.COMPANY.COM
(kdeDOMAIN.COMPANY.COM
odpovídá názvu vaší domény)ukázkový výstup
DC: \\co1-red-dc-33.domain.company.com Address: \\2111:4444:2111:33:1111:ecff:ffff:3333 ... The command completed successfully
Informace k extrakci názvu řadiče domény, v tomto případě
co1-red-dc-33.domain.company.com
Krok 2: Konfigurace KDC v krb5.conf
Spustit na: Linux/macOS
akce: Upravte
/etc/krb5.conf
v editoru dle vašeho výběru. Konfigurace následujících klíčů[libdefaults] default_realm = DOMAIN.COMPANY.COM [realms] DOMAIN.COMPANY.COM = { kdc = co1-red-dc-28.domain.company.com }
Poté uložte soubor
krb5.conf
a ukončete.Poznámka
Doména musí být napsána pouze velkými písmeny.
Krok 3: Otestování načtení lístku pro udělení lístku
- Spustit na: Linux/macOS
-
Akce:
- Pomocí příkazu
kinit username@DOMAIN.COMPANY.COM
získáte TGT z KDC a pak vás vyzve k zadání hesla k doméně. - K zobrazení dostupných lístků použijte
klist
. Pokud byl kinit úspěšný, měli byste vidět lístek zkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
- Pomocí příkazu
Připojení pomocí režimu ověřování ActiveDirectoryPassword
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryPassword
.
Sestavení a spuštění příkladu:
Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .
Vyhledejte následující řádky kódu a nahraďte název serveru nebo databáze názvem serveru nebo databáze.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Vyhledejte následující řádky kódu. Nahraďte uživatelské jméno jménem uživatele Microsoft Entra, ke kterému se chcete připojit.
ds.setUser("bob@example.com"); // replace with your username ds.setPassword("password"); // replace with your password
Příklad použití režimu ověřování 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));
}
}
}
}
Pokud je připojení navázáno, měla by se zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your user name>
Připojení pomocí režimu ověřování ActiveDirectoryInteractive
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryInteractive
.
Sestavení a spuštění příkladu:
Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .
Vyhledejte následující řádky kódu a nahraďte název serveru nebo databáze názvem serveru nebo databáze.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Vyhledejte následující řádky kódu. Nahraďte uživatelské jméno jménem uživatele Microsoft Entra, kterého chcete připojit jako.
ds.setUser("bob@example.com"); // replace with your username
Příklad použití režimu ověřování 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));
}
}
}
}
Když program spustíte, zobrazí se prohlížeč pro ověření uživatele. Přesně to, co vidíte, závisí na tom, jak nakonfigurujete ID Microsoft Entra. Může nebo nemusí obsahovat vícefaktorové výzvy k ověření pomocí uživatelského jména, hesla, PIN kódu nebo druhého ověřování zařízení přes telefon. Pokud se ve stejném programu provádí více interaktivních žádostí o ověření, nemusí se později ani zobrazit výzva, pokud knihovna ověřování může znovu použít dříve uložený ověřovací token v mezipaměti.
Informace o tom, jak nakonfigurovat ID Microsoft Entra tak, aby vyžadovalo vícefaktorové ověřování, najdete v tématu Začínáme s vícefaktorovým ověřováním Microsoft Entra v cloudovém.
Snímky obrazovky s těmito dialogovými okny najdete v tématu Použití vícefaktorového ověřování Microsoft Entra.
Pokud se ověření uživatele úspěšně dokončilo, měla by se v prohlížeči zobrazit následující zpráva:
Authentication complete. You can close the browser and return to the application.
Tato zpráva označuje, že ověření uživatele bylo úspěšné, ale nemusí nutně být úspěšné připojení k serveru. Po návratu do aplikace, pokud je připojení k serveru navázáno, by se měla zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your user name>
Připojení pomocí režimu ověřování ActiveDirectoryServicePrincipal
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryServicePrincipal
.
Sestavení a spuštění příkladu:
Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .
Vyhledejte následující řádky kódu a nahraďte název serveru nebo databáze názvem serveru nebo databáze.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Vyhledejte následující řádky kódu. Nahraďte hodnotu
principalId
ID aplikace / ID klienta služby Microsoft Entra, ke které se chcete připojit. Nahraďte hodnotuprincipalSecret
tajným kódem.String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID. String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
Nastavte hlavní ID a heslo pomocí
setUser
asetPassword
ve verzi 10.2 a novější asetAADSecurePrincipalId
asetAADSecurePrincipalSecret
ve verzi 9.4 a nižší.
Příklad použití režimu ověřování 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));
}
}
}
}
Pokud je připojení navázáno, měla by se zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your app/client ID>
Připojte se pomocí ověřovacího režimu ActiveDirectoryServicePrincipalCertificate
Následující příklad ukazuje, jak používat režim authentication=ActiveDirectoryServicePrincipalCertificate
.
Sestavení a spuštění příkladu:
Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .
Vyhledejte následující řádky kódu a nahraďte název serveru nebo databáze názvem serveru nebo databáze.
ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name ds.setDatabaseName("demo"); // replace with your database name
Vyhledejte následující řádky kódu. Nahraďte hodnotu
principalId
identifikátorem aplikace / klienta instančního objektu služby Microsoft Entra, ke kterému se chcete připojit. Nahraďte hodnotuclientCertificate
umístěním souboru s certifikátem hlavního objektu služby.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.
Pokud dříve uvedený certifikát potřebuje heslo, nastavte hlavní tajný klíč pomocí
setPassword
ve verzích 10.2 a vyšších nebosetAADSecurePrincipalSecret
ve verzích 9.4 a starších.Pokud má certifikát přidružený privátní klíč, nastavte privátní klíč pomocí
setClientKey
. Pokud tento klíč vyžaduje heslo, nastavte heslo pro privátní klíč pomocísetClientKeyPassword
.
Příklad použití režimu ověřování 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));
}
}
}
}
Pokud je připojení navázáno, měla by se zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your app/client ID>
Připojení pomocí přístupového tokenu
Aplikace/služby můžou načíst přístupový token z ID Microsoft Entra a použít ho k připojení ke službě Azure SQL Database, azure SQL Managed Instance a Azure Synapse Analytics.
Poznámka
accessToken
lze nastavit pouze pomocí parametru Properties metody getConnection()
ve třídě DriverManager. Nedá se použít v připojovacím řetězci. Počínaje verzí ovladače 12.2 mohou uživatelé implementovat a poskytovat zpětné volání accessToken
ovladači pro obnovu tokenu ve scénářích sdružování připojení. Scénáře sdružování připojení vyžadují, aby implementace fondu připojení používala standardní třídy sdružování připojení JDBC.
Následující příklad obsahuje jednoduchou aplikaci Java, která se připojuje k Azure pomocí ověřování na základě přístupového tokenu.
Sestavení a spuštění příkladu:
Vytvořte účet aplikace v Microsoft Entra ID pro vaši službu.
- Přihlaste se k webu Azure Portal.
- V levém navigačním panelu přejděte na Microsoft Entra ID.
- Vyberte registrace aplikací.
- Vyberte Nová registrace.
- Jako srozumitelný název aplikace zadejte
mytokentest
. - U podporovaných typů účtů, které můžou aplikaci používat, ponechte výchozí výběr.
- Ve spodní části vyberte registr.
- Není potřeba SIGN-ON URL. Zadejte cokoli:
https://mytokentest
. - Vyberte
Create
ve spodní části. - Po zvolení Zaregistrovatje aplikace okamžitě vytvořena a přejdete na stránku zdroje.
- V poli Základy najděte ID aplikace (klienta) a zkopírujte ho. Tuto hodnotu budete potřebovat později ke konfiguraci aplikace.
- V navigačním podokně vyberte Certifikáty & tajemství. Na kartě Tajné klíče klienta (0) vyberte Nový tajný klíč klienta. Zadejte popis tajného kódu a vyberte vypršení platnosti (výchozí hodnota je v pořádku). V dolní části vyberte Přidat. Důležité před opuštěním této stránky zkopírujte vygenerovanou hodnotu pro tajný klíč klienta. Tuto hodnotu nelze zobrazit po opuštění stránky. Tato hodnota je klientské tajemství.
- Vraťte se do podokna registrace aplikací pro ID Microsoft Entra a vyhledejte kartu Koncové body. Zkopírujte adresu URL v části
OAuth 2.0 token endpoint
. Tato adresa URL je adresa URL služby STS.
Připojte se k databázi jako správce Microsoft Entra a pomocí příkazu T-SQL zřiďte uživatele databáze s omezením pro instanční objekt aplikace. Další informace o tom, jak vytvořit správce Microsoft Entra a uživatele databáze s omezením, naleznete v Připojení pomocí ověřování Microsoft Entra.
CREATE USER [mytokentest] FROM EXTERNAL PROVIDER
Na klientském počítači, na kterém spustíte příklad, stáhněte knihovnu Microsoft Authentication Library (MSAL) pro javu a její závislosti. Ke spuštění tohoto konkrétního příkladu je nutné pouze MSAL. Příklad používá rozhraní API z této knihovny k načtení přístupového tokenu z ID Microsoft Entra. Pokud už přístupový token máte, můžete tento krok přeskočit a odebrat oddíl v příkladu, který načte přístupový token.
V následujícím příkladu nahraďte adresu URL služby STS, ID klienta, tajný klíč klienta, název serveru a databáze hodnotami.
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));
}
}
}
}
Pokud je připojení úspěšné, měla by se zobrazit následující zpráva jako výstup:
Access Token: <your access token>
You have successfully logged on as: <your client ID>
Připojení pomocí zpětného volání přístupového tokenu
Podobně jako vlastnost přístupového tokenu umožňuje zpětné volání přístupového tokenu zaregistrovat metodu, která ovladači poskytuje přístupový token. Výhodou zpětného volání oproti vlastnosti je, že ovladač může požádat o nový přístupový token, když je platnost tokenu vypršela. Například fond připojení, který vytváří nové připojení, může požádat o nový token s novým datem vypršení platnosti. Další informace naleznete v tématu Používání sdružování připojení.
Následující příklad ukazuje implementaci a nastavení zpětného volání 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));
}
}
}
}
Pokud je připojení úspěšné, měla by se zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your client ID>
Od verze 12.4 je možné nastavit zpětné volání accessToken
prostřednictvím vlastnosti accessTokenCallbackClass
připojovacího řetězce. Následující příklad ukazuje, jak nastavit zpětné volání accessToken
pomocí této vlastnosti:
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));
}
}
}
}
Pokud je připojení úspěšné, měla by se zobrazit následující zpráva jako výstup:
You have successfully logged on as: <your client ID>
Další kroky
Další informace o souvisejících konceptech najdete v následujících článcích: