Delen via


Verbinding maken met Behulp van Microsoft Entra-verificatie

JDBC-stuurprogramma downloaden

Dit artikel bevat informatie over het ontwikkelen van Java-toepassingen die gebruikmaken van de Microsoft Entra-verificatiefunctie met het Microsoft JDBC-stuurprogramma voor SQL Server.

U kunt Microsoft Entra-verificatie gebruiken. Dit is een mechanisme om verbinding te maken met Azure SQL Database, Azure SQL Manged Instance en Azure Synapse Analytics met behulp van identiteiten in Microsoft Entra ID. Gebruik Microsoft Entra-verificatie om identiteiten van databasegebruikers centraal te beheren en als alternatief voor SQL Server-verificatie. Met het JDBC-stuurprogramma kunt u uw Microsoft Entra-referenties opgeven in de JDBC-verbindingsreeks om verbinding te maken met Azure SQL. Voor meer informatie over het configureren van Microsoft Entra-verificatie gaat u naar Verbinding maken met Azure SQL met behulp van Microsoft Entra-verificatie.

Verbindingseigenschappen ter ondersteuning van Microsoft Entra-verificatie in het Microsoft JDBC-stuurprogramma voor SQL Server zijn:

  • verificatie: Gebruik deze eigenschap om aan te geven welke SQL-verificatiemethode moet worden gebruikt voor de verbinding. Mogelijke waarden zijn:
    • ActiveDirectoryManagedIdentity

      • Sinds stuurprogrammaversie 8.3.1 kan men authentication=ActiveDirectoryMSI gebruiken om vanuit een Azure-resource, waar de ondersteuning voor identiteit is ingeschakeld, verbinding te maken met een Azure SQL Database/Synapse Analytics. MsiClientId kan eventueel worden opgegeven in de eigenschappen Connection/DataSource, samen met deze verificatiemodus. msiClientId moet de client-id van een beheerde identiteit bevatten die moet worden gebruikt om het accessToken te verkrijgen voor het tot stand brengen van de verbinding. Vanaf stuurprogrammaversie v12.2 kan authentication=ActiveDirectoryManagedIdentity ook worden gebruikt om verbinding te maken met een Azure SQL Database/Synapse Analytics vanaf een Azure-resource met ingeschakelde ondersteuning voor identiteiten. Desgewenst kan de client-id van een beheerde identiteit ook worden ingesteld in de user eigenschap. Zie Verbinding maken met de verificatiemodus ActiveDirectoryManagedIdentity voor meer informatie.
    • ActiveDirectoryDefault

    • ActiveDirectoryIntegrated

      • Sinds stuurprogrammaversie 6.0 kan authentication=ActiveDirectoryIntegrated worden gebruikt om via geïntegreerde verificatie verbinding te maken met Azure SQL/Synapse Analytics. Als u deze verificatiemodus wilt gebruiken, moet u de on-premises Active Directory Federation Services (ADFS) federeren met Microsoft Entra-id in de cloud. Zodra u deze hebt ingesteld, kunt u verbinding maken door de systeemeigen bibliotheek mssql-jdbc_auth-<version>-<arch>.dll toe te voegen aan het pad naar de toepassingsklasse in Windows of door een Kerberos-ticket in te stellen voor ondersteuning voor platformoverschrijdende verificatie. U hebt toegang tot Azure SQL/Azure Synapse Analytics zonder dat u om referenties wordt gevraagd wanneer u bent aangemeld bij een computer die lid is van een domein. Zie Verbinding maken met activeDirectoryIntegrated-verificatiemodus voor meer informatie.
    • ActiveDirectoryPassword

    • ActiveDirectoryInteractive

    • ActiveDirectoryServicePrincipal

      • Sinds stuurprogrammaversie 9.2 kan authentication=ActiveDirectoryServicePrincipal worden gebruikt om verbinding te maken met een Azure SQL/Synapse Analytics door de toepassings-/client-id op te geven in de eigenschap UserName en het geheim van een service-principal-identiteit in de wachtwoordeigenschap. Zie Verbinding maken met de ActiveDirectoryServicePrincipal-verificatiemodus voor meer informatie.
    • Active Directory-servicehoofdcertificaat

    • SqlPassword

      • Gebruik authentication=SqlPassword om verbinding te maken met een SQL Server met de eigenschappen username/user en password.
    • Niet opgegeven

      • Gebruik authentication=NotSpecified of laat deze staan als de standaardinstelling wanneer geen van deze verificatiemethoden nodig is.
    • accessToken: Gebruik deze verbindingseigenschap om verbinding te maken met een SQL Database met een toegangstoken. accessToken kan alleen worden ingesteld met behulp van de parameter Properties van de getConnection() methode in de klasse DriverManager. Deze kan niet worden gebruikt in de verbindings-URL.

Zie de verificatie-eigenschap op de pagina Verbindingseigenschappen instellen voor meer informatie.

Vereisten voor clientinstallatie

Naast de basisvereisten voor het stuurprogramma zijn er voor de volgende verificatiemodi meer vereisten.

De volgende tabel bevat de vereiste bibliotheekafhankelijkheden voor elke verificatiemodus en stuurprogrammaversie. Afhankelijkheden van afhankelijkheden zijn ook vereist.

Opmerking

In gevallen waarin de hotfix voor een primaire release een andere afhankelijkheidsversie heeft dan de primaire release, wordt de hotfix ook vermeld.

Verificatieoptie Stuurprogrammaversies Bibliotheekafhankelijkheden
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 Adal4j 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

Verbinding maken met de verificatiemodus ActiveDirectoryManagedIdentity

Deze verificatiemodus wordt ondersteund vanaf versie 7.2. Als u deze wilt gebruiken, geeft u op authentication=ActiveDirectoryMSI. Vanaf versie 12.2 kan authentication=ActiveDirectoryManagedIdentity ook opgegeven worden.

Naast de bibliotheekafhankelijkheidsvereisten die worden vermeld in clientinstallatievereisten, heeft deze functie de volgende vereisten:

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryManagedIdentity . Voer dit voorbeeld uit vanuit een Azure-resource die is geconfigureerd voor beheerde identiteit.

Om het voorbeeld te laten werken, moet u de server-/databasenaam vervangen door uw eigen server-/databasenaam in de volgende regels.

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

Het voorbeeld om ActiveDirectoryMSI authenticatiemodus te gebruiken:

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));
            }
        }
    }
}

In het volgende voorbeeld ziet u hoe u de modus gebruikt 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));
            }
        }
    }
}

Deze voorbeelden op een virtuele Azure-machine halen een toegangstoken op uit Systeemtoegewezen Beheerde Identiteit of Gebruikerstoegewezen Beheerde Identiteit (als msiClientId of user is opgegeven met een client-id van een Beheerde Identiteit) en brengt een verbinding tot stand met behulp van het opgehaalde toegangstoken. Als er een verbinding tot stand is gebracht, ziet u het volgende bericht:

You have successfully logged on as: <your Managed Identity username>

Verbinding maken met de ActiveDirectoryDefault-verificatiemodus

De ActiveDirectoryDefault verificatieoptie maakt gebruik van de gekoppelde DefaultAzureCredential implementatie van TokenCredential de Azure Identity-clientbibliotheek. De credential combineert veelgebruikte verificatiemethoden die aan elkaar zijn gekoppeld.

ActiveDirectoryDefault verificatie vereist een runtime-afhankelijkheid van de Azure Identity-clientbibliotheek voor beheerde identiteit. Zie Client-installatievereisten voor informatie over bibliotheekversies.

De volgende tabel bevat de DefaultAzureCredential referentieketen voor elke JDBC-stuurprogrammaversie.

Versie van het stuurprogramma azure-identity-versie DefaultAzureCredential ketting
12.2 azure-identity 1.7.0 Milieu
Beheerde identiteit
IntelliJ
Azure-opdrachtregelinterface (CLI)
Azure PowerShell
12.4 azure-identity 1.9.0 Milieu
Workloadidentiteit
Beheerde identiteit
Azure-ontwikkelaars-CLI
IntelliJ
Azure-opdrachtregelinterface (CLI)
Azure PowerShell
12,6 azure-identity 1.11.1 Milieu
Workloadidentiteit
Beheerde identiteit
Azure-ontwikkelaars-CLI
IntelliJ
Azure-opdrachtregelinterface (CLI)
Azure PowerShell
12.8 azure-identity 1.12.2 Milieu
Workloadidentiteit
Beheerde identiteit
Azure-ontwikkelaars-CLI
IntelliJ
Azure-opdrachtregelinterface (CLI)
Azure PowerShell
12.10 azure-identity 1.15.3 Milieu
Workloadidentiteit
Beheerde identiteit
Azure-ontwikkelaars-CLI
IntelliJ
Azure-opdrachtregelinterface (CLI)
Azure PowerShell

Er zijn veel variabelen die kunnen worden ingesteld om de Environment referentie te configureren. Zie de relevante versie van de azure-identity-documenten die zijn gekoppeld in de vorige tabel voor meer informatie over het configureren van de DefaultAzureCredential keten, inclusief de Environment referentie.

Als u de IntellijCredential omgevingsvariabele in Windows wilt gebruiken, stelt u de omgevingsvariabele INTELLIJ_KEEPASS_PATH in op de locatie van uw keepass bestand. Bijvoorbeeld: INTELLIJ_KEEPASS_PATH=C:\user\your\path\to\the\keepass\file.

Gebruik de omgevingsvariabele DefaultAzureCredential om meer tenants aan de ADDITIONALLY_ALLOWED_TENANTS toe te voegen. Deze variabele maakt een door komma's gescheiden lijst. Bijvoorbeeld ADDITIONALLY_ALLOWED_TENANTS=<your-tenant-id-0>,<your-tenant-id-1>,<your-tenant-id-2>,...

In het volgende voorbeeld ziet u hoe authentication=ActiveDirectoryDefault modus wordt gebruikt met AzureCliCredential binnen DefaultAzureCredential.

  1. Meld u eerst aan bij de Azure CLI met de volgende opdracht.

    az login
    
  2. Nadat u zich hebt aangemeld bij de Azure CLI, voert u de volgende code uit.

    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));
                }
            }
        }
    }
    

Verbind met de ActiveDirectoryIntegrated-authenticatiemodus.

Er zijn twee manieren om verificatie te gebruiken ActiveDirectoryIntegrated in het Microsoft JDBC-stuurprogramma voor SQL Server:

  • In Windows mssql-jdbc_auth-<version>-<arch>.dll kan vanuit het gedownloade pakket worden gekopieerd naar een locatie in het systeempad.
  • Als u de DLL niet kunt gebruiken, vanaf versie 6.4, kunt u een Kerberos-ticket configureren. Deze methode wordt ondersteund op verschillende platforms (Windows, Linux en macOS). Zie Kerberos-ticket instellen voor Windows, Linux en macOS voor meer informatie.

Zorg ervoor dat u beschikt over de vereiste afhankelijke bibliotheken van de clientinstallatievereisten.

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryIntegrated . Dit voorbeeld wordt uitgevoerd op een computer die lid is van een domein dat is gefedereerd met Microsoft Entra-id. Een databasegebruiker die uw Windows-gebruiker vertegenwoordigt, moet aanwezig zijn in de database en moet de machtiging CONNECT hebben.

Vervang de server-/databasenaam door uw eigen server-/databasenaam in de volgende regels voordat u het voorbeeld uitvoert.

ds.setServerName("msentra-managed-demo.database.windows.net"); // replace 'msentra-managed-demo' with your server name
ds.setDatabaseName("demo"); // replace with your database name

Het voorbeeld voor het gebruik van de ActiveDirectoryIntegrated-verificatiemodus:

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));
            }
        }
    }
}

Als u dit voorbeeld uitvoert, wordt automatisch uw Kerberos-ticket van het clientplatform gebruikt en is er geen wachtwoord vereist. Als er een verbinding tot stand is gebracht, ziet u het volgende bericht:

You have successfully logged on as: <your domain user name>

Kerberos-ticket instellen in Windows, Linux en macOS

U moet een Kerberos-ticket instellen om uw huidige gebruiker te koppelen aan een Windows-domeinaccount. Hieronder volgt een samenvatting van de belangrijkste stappen.

Ramen

Opmerking

In Windows mssql-jdbc_auth-<version>-<arch>.dll kan vanuit het gedownloade pakket worden gebruikt in plaats van deze Kerberos-configuratiestappen. Deze stappen zijn alleen vereist als u het DLL-bestand niet kunt gebruiken.

JDK wordt geleverd met kinit, waarmee u een TGT kunt verkrijgen van het Key Distribution Center (KDC) op een machine die lid is van een domein dat is gefedereerd met Microsoft Entra ID.

Stap 1: Ticket verlenen van ticket ophalen
  • Draait op: Windows

  • actie:

    • Gebruik de opdracht kinit username@DOMAIN.COMPANY.COM om een TGT van KDC op te halen en vervolgens wordt u gevraagd om uw domeinwachtwoord.
    • Gebruik klist dit om de beschikbare tickets te bekijken. Als de kinit succesvol voltooid is, zou u een ticket van krbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM moeten zien.

    Opmerking

    Mogelijk moet u een .ini bestand opgeven waarmee -Djava.security.krb5.conf uw toepassing KDC kan vinden.

Linux en macOS

Behoeften

Toegang tot een Windows-computer die lid is van een domein om een query uit te voeren op uw Kerberos-domeincontroller.

Stap 1: Kerberos KDC zoeken
  • Uitvoeren op: Windows opdrachtprompt

  • Actie: nltest /dsgetdc:DOMAIN.COMPANY.COM (waar wordt DOMAIN.COMPANY.COM toegewezen aan de naam van uw domein)

  • Voorbeelduitvoer

    DC: \\co1-red-dc-33.domain.company.com
    Address: \\2111:4444:2111:33:1111:ecff:ffff:3333
    ...
    The command completed successfully
    
  • Informatie die moet worden geëxtraheerd De DC-naam, in dit geval co1-red-dc-33.domain.company.com

Stap 2: KDC configureren in krb5.conf
  • Uitvoeren op: Linux/macOS

  • Actie: Bewerk de /etc/krb5.conf in een editor van uw keuze. De volgende sleutels configureren

    [libdefaults]
      default_realm = DOMAIN.COMPANY.COM
    
    [realms]
    DOMAIN.COMPANY.COM = {
       kdc = co1-red-dc-28.domain.company.com
    }
    

    Sla het krb5.conf bestand vervolgens op en sluit het af.

    Opmerking

    Het domein moet in ALL CAPS staan.

Stap 3: Het ticket testen dat ticket ophalen verleent
  • Uitvoeren op: Linux/macOS
  • Actie:
    • Gebruik de opdracht kinit username@DOMAIN.COMPANY.COM om een TGT van KDC op te halen en vervolgens wordt u gevraagd om uw domeinwachtwoord.
    • Gebruik klist dit om de beschikbare tickets te bekijken. Als de kinit succesvol voltooid is, zou u een ticket van krbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM moeten zien.

Verbinding maken met de verificatiemodus ActiveDirectoryPassword

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryPassword .

Ga als volgt te werk om het voorbeeld te bouwen en uit te voeren:

  1. Zorg ervoor dat u beschikt over de vereiste afhankelijke bibliotheken van de clientinstallatievereisten.

  2. Zoek de volgende regels code en vervang de server-/databasenaam door de naam van uw server/database.

    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. Zoek de volgende regels van de code. Vervang de gebruikersnaam door de naam van de Microsoft Entra-gebruiker die u als verbinding wilt maken.

    ds.setUser("bob@example.com"); // replace with your username
    ds.setPassword("password");     // replace with your password
    

Het voorbeeld om ActiveDirectoryPassword authenticatiemodus te gebruiken:

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));
            }
        }
    }
}

Als de verbinding tot stand is gebracht, ziet u het volgende bericht als uitvoer:

You have successfully logged on as: <your user name>

Verbinding maken met de activeDirectoryInteractive-verificatiemodus

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryInteractive .

Ga als volgt te werk om het voorbeeld te bouwen en uit te voeren:

  1. Zorg ervoor dat u beschikt over de vereiste afhankelijke bibliotheken van de clientinstallatievereisten.

  2. Zoek de volgende regels code en vervang de server-/databasenaam door de naam van uw server/database.

    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. Zoek de volgende regels van de code. Vervang de gebruikersnaam door de naam van de Microsoft Entra-gebruiker die u als verbinding wilt maken.

    ds.setUser("bob@example.com"); // replace with your username
    

Het voorbeeld om ActiveDirectoryInteractive authenticatiemodus te gebruiken:

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));
            }
        }
    }
}

Wanneer u het programma uitvoert, wordt er een browser weergegeven om de gebruiker te verifiëren. Precies wat u ziet, is afhankelijk van hoe u uw Microsoft Entra-id configureert. Het kan al dan niet meervoudige verificatieprompts bevatten voor gebruikersnaam, wachtwoord, pincode of tweede apparaatverificatie via een telefoon. Als er meerdere interactieve verificatieaanvragen worden uitgevoerd in hetzelfde programma, wordt u in latere aanvragen mogelijk niet eens gevraagd of de verificatiebibliotheek een eerder in de cache opgeslagen verificatietoken opnieuw kan gebruiken.

Zie Aan de slag met Microsoft Entra-verificatie in de cloudvoor meer informatie over het configureren van Microsoft Entra-id voor meervoudige verificatie.

Zie voor schermafbeeldingen van deze dialoogvensters Microsoft Entra multifactor authentication gebruiken.

Als gebruikersverificatie is voltooid, ziet u het volgende bericht in de browser:

Authentication complete. You can close the browser and return to the application.

Dit bericht geeft alleen aan dat gebruikersverificatie is geslaagd, maar niet noodzakelijkerwijs een geslaagde verbinding met de server. Als er een verbinding met de server tot stand is gebracht, ziet u het volgende bericht als uitvoer wanneer u terugkeert naar de toepassing:

You have successfully logged on as: <your user name>

Verbind met de verificatiemodus ActiveDirectoryServicePrincipal

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryServicePrincipal .

Ga als volgt te werk om het voorbeeld te bouwen en uit te voeren:

  1. Zorg ervoor dat u beschikt over de vereiste afhankelijke bibliotheken van de clientinstallatievereisten.

  2. Zoek de volgende regels code en vervang de server-/databasenaam door de naam van uw server/database.

    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. Zoek de volgende regels van de code. Vervang de waarde van principalId door de toepassings-id/client-id van de service-principal van Microsoft Entra waarmee u verbinding wilt maken. Vervang de waarde van principalSecret door het geheim.

    String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID.
    String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
    
  4. Stel het principal-ID en de principal-secreet in met behulp van setUser en setPassword in versie 10.2 en hoger, en setAADSecurePrincipalId en setAADSecurePrincipalSecret in versie 9.4 en lager.

Het voorbeeld om ActiveDirectoryServicePrincipal authenticatiemodus te gebruiken:

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));
            }
        }
    }
}

Als er een verbinding tot stand is gebracht, ziet u het volgende bericht als uitvoer:

You have successfully logged on as: <your app/client ID>

Verbinding maken met de verificatiemodus ActiveDirectoryServicePrincipalCertificate

In het volgende voorbeeld ziet u hoe u de modus gebruikt authentication=ActiveDirectoryServicePrincipalCertificate .

Ga als volgt te werk om het voorbeeld te bouwen en uit te voeren:

  1. Zorg ervoor dat u beschikt over de vereiste afhankelijke bibliotheken van de clientinstallatievereisten.

  2. Zoek de volgende regels code en vervang de server-/databasenaam door de naam van uw server/database.

    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. Zoek de volgende regels van de code. Vervang de waarde van principalId door de toepassings-id/client-id van de service-principal van Microsoft Entra waarmee u verbinding wilt maken. Vervang de waarde door clientCertificate het bestandspad naar het service-principal-certificaat.

    String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID.
    
    String clientCertificate = "..."; // Replace with the path to your Microsoft Entra service principal certificate.
    
  4. Als het eerder genoemde certificaat een wachtwoord nodig heeft, stelt u het hoofdzakelijke geheim in met setPassword in versie 10.2 en hoger of setAADSecurePrincipalSecret in versie 9.4 en lager.

  5. Als het certificaat een bijbehorende persoonlijke sleutel heeft, stelt u de persoonlijke sleutel in met behulp van setClientKey. Als voor deze sleutel een wachtwoord is vereist, stelt u het wachtwoord voor de persoonlijke sleutel in met behulp van setClientKeyPassword.

Het voorbeeld om ActiveDirectoryServicePrincipalCertificate authenticatiemodus te gebruiken:

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 path to 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));
            }
        }
    }
}

Als er een verbinding tot stand is gebracht, ziet u het volgende bericht als uitvoer:

You have successfully logged on as: <your app/client ID>

Verbinding maken met behulp van toegangstoken

Toepassingen/services kunnen een toegangstoken ophalen uit Microsoft Entra ID en deze gebruiken om verbinding te maken met Azure SQL Database, Azure SQL Managed Instance en Azure Synapse Analytics.

Opmerking

accessToken kan alleen worden ingesteld met behulp van de parameter Properties van de getConnection() methode in de klasse DriverManager. Deze kan niet worden gebruikt in de verbindingsreeks. Vanaf stuurprogrammaversie 12.2 kunnen gebruikers een accessToken callback naar het stuurprogramma implementeren en bieden voor het vernieuwen van tokens in verbindingspoolscenario's. Scenario's voor groepsgewijze verbindingen vereisen dat de implementatie van de verbindingsgroep gebruikmaakt van de standaard JDBC-verbindingspoolklassen.

Het volgende voorbeeld bevat een eenvoudige Java-toepassing die verbinding maakt met Azure met behulp van verificatie op basis van toegangstokens.

Ga als volgt te werk om het voorbeeld te bouwen en uit te voeren:

  1. Maak een toepassingsaccount in Microsoft Entra-id voor uw service.

    1. Meld u aan bij het Azure-portaal.
    2. Ga in de linkernavigatiebalk naar Microsoft Entra-id .
    3. Selecteer App-registratie.
    4. Selecteer Nieuwe registratie.
    5. Voer mytokentest een vriendelijke naam in voor de toepassing.
    6. Laat de standaardselectie staan voor ondersteunde accounttypen, die de toepassing kunnen gebruiken.
    7. Selecteer Registreren onderaan.
    8. U hebt geen SIGN-ON URL nodig. Geef alles op: https://mytokentest.
    9. Selecteer Create onderaan.
    10. Wanneer u Registreren selecteert, wordt de app onmiddellijk gemaakt en gaat u naar de resourcepagina.
    11. Zoek in het vak Essentials de toepassings-id (client) en kopieer deze. U hebt deze waarde later nodig om uw toepassing te configureren.
    12. Selecteer Certificaten en geheimen in het navigatiedeelvenster. Selecteer Op het tabblad Clientgeheimen (0)de optie Nieuw clientgeheim. Voer een beschrijving in voor het geheim en selecteer een vervaldatum (de standaardwaarde is prima). Selecteer Toevoegen onderaan. Belangrijk voordat u deze pagina verlaat, kopieert u de gegenereerde waarde voor uw clientgeheim. Deze waarde kan niet worden weergegeven nadat u de pagina hebt verlaten. Deze waarde is het clientgeheim.
    13. Ga terug naar het deelvenster App-registraties voor Microsoft Entra-id en zoek het tabblad Eindpunten . Kopieer de URL onder OAuth 2.0 token endpoint. Deze URL is uw STS-URL.
  2. Maak verbinding met uw database als Microsoft Entra-beheerder en gebruik een T-SQL-opdracht om een ingesloten databasegebruiker in te richten voor uw toepassingsprincipaal. Zie voor meer informatie over het maken van een Microsoft Entra-beheerder en een ingesloten databasegebruiker de verbinding maken met behulp van Microsoft Entra-verificatie.

    CREATE USER [mytokentest] FROM EXTERNAL PROVIDER
    
  3. Download op de clientcomputer waarop u het voorbeeld uitvoert de MICROSOFT Authentication Library (MSAL) voor Java-bibliotheek en de bijbehorende afhankelijkheden. MSAL is alleen nodig voor het uitvoeren van dit specifieke voorbeeld. In het voorbeeld worden de API's uit deze bibliotheek gebruikt om het toegangstoken op te halen uit de Microsoft Entra-id. Als u al een toegangstoken hebt, kunt u deze stap overslaan en de sectie in het voorbeeld verwijderen waarmee een toegangstoken wordt opgehaald.

Vervang in het volgende voorbeeld de STS-URL, client-id, clientgeheim, server- en databasenaam door uw waarden.

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));
            }
        }
    }
}

Als de verbinding is geslaagd, ziet u het volgende bericht als uitvoer:

Access Token: <your access token>
You have successfully logged on as: <your client ID>

Verbinding maken met behulp van callback van toegangstokens

Net als bij de eigenschap van het toegangstoken, stelt de callback voor toegangstoken u in staat een methode te registreren die een toegangstoken aan de driver verstrekt. Het voordeel van deze callback boven de eigenschap is dat het stuurprogramma een nieuw toegangstoken kan aanvragen wanneer het token is verlopen. Een verbindingsgroep die een nieuwe verbinding maakt, kan bijvoorbeeld een nieuw token aanvragen met een nieuwe vervaldatum. Zie Groepsgewijze verbindingen gebruiken voor meer informatie.

In het volgende voorbeeld ziet u hoe u de callback van accessToken implementeert en instelt.

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));
            }
        }
    }
}

Als de verbinding is geslaagd, ziet u het volgende bericht als uitvoer:

You have successfully logged on as: <your client ID>

Vanaf versie 12.4 kan de accessToken callback worden ingesteld via de accessTokenCallbackClass eigenschap verbindingsreeks. In het volgende voorbeeld ziet u hoe u de accessToken callback instelt met behulp van deze eigenschap:

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));
            }
        }
    }
}

Als de verbinding is geslaagd, ziet u het volgende bericht als uitvoer:

You have successfully logged on as: <your client ID>

Volgende stappen

Meer informatie over gerelateerde concepten vindt u in de volgende artikelen: