Sdílet prostřednictvím


Připojení pomocí ověřování Microsoft Entra

Stáhnout ovladač JDBC

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 lze authentication=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 vlastnosti user. Další informace naleznete v tématu Připojení pomocí režimu ověřování na základě identity spravované Active Directory.
    • ActiveDirectoryDefault

    • 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í knihovny mssql-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.
    • ActiveDirectoryPassword

    • 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.
    • 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.
    • 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 vlastnosti clientCertificate. Další informace najdete v tématu Connect pomocí režimu ověřování ActiveDirectoryServicePrincipalCertificate.
    • SqlPassword

      • Pomocí authentication=SqlPassword se připojte k SQL Serveru pomocí vlastností userName/user a password.
    • Neurčeno

      • Použijte authentication=NotSpecified nebo ho ponechte jako výchozí, pokud nejsou potřeba žádné z těchto metod ověřování.
    • 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 metody getConnection() 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.3
Client-Runtime-for-AutoRest 1.6.5
ActiveDirectoryPassword
ActiveDirectoryIntegrated
7.4 - 8.2 Adal4jl4j 1.6.4
Client-Runtime-for-AutoRest 1.7.0
ActiveDirectoryPassword
ActiveDirectoryIntegrated
8.4 Adal4j 1.6.5
Client-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:

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 DefaultAzureCredentialTokenCredential. 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 DefaultAzureCredentialpouž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.

  1. Nejdřív se přihlaste k Azure CLI pomocí následujícího příkazu.

    az login
    
  2. 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:

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 z krbtgt/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.

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 (kde DOMAIN.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 z krbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM.

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:

  1. Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .

  2. 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
    
  3. 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:

  1. Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .

  2. 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
    
  3. 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:

  1. Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .

  2. 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
    
  3. 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 hodnotu principalSecret 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.
    
  4. Nastavte hlavní ID a heslo pomocí setUser a setPassword ve verzi 10.2 a novější a setAADSecurePrincipalId a setAADSecurePrincipalSecret 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:

  1. Ujistěte se, že máte požadované závislé knihovny z požadavků na nastavení klienta .

  2. 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
    
  3. 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 hodnotu clientCertificate 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.
    
  4. Pokud dříve uvedený certifikát potřebuje heslo, nastavte hlavní tajný klíč pomocí setPassword ve verzích 10.2 a vyšších nebo setAADSecurePrincipalSecret ve verzích 9.4 a starších.

  5. 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:

  1. Vytvořte účet aplikace v Microsoft Entra ID pro vaši službu.

    1. Přihlaste se k webu Azure Portal.
    2. V levém navigačním panelu přejděte na Microsoft Entra ID.
    3. Vyberte registrace aplikací.
    4. Vyberte Nová registrace.
    5. Jako srozumitelný název aplikace zadejte mytokentest.
    6. U podporovaných typů účtů, které můžou aplikaci používat, ponechte výchozí výběr.
    7. Ve spodní části vyberte registr.
    8. Není potřeba SIGN-ON URL. Zadejte cokoli: https://mytokentest.
    9. Vyberte Create ve spodní části.
    10. Po zvolení Zaregistrovatje aplikace okamžitě vytvořena a přejdete na stránku zdroje.
    11. V poli Základy najděte ID aplikace (klienta) a zkopírujte ho. Tuto hodnotu budete potřebovat později ke konfiguraci aplikace.
    12. 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í.
    13. 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.
  2. 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
    
  3. 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: