Dela via


Ansluta med Microsoft Entra-autentisering

Ladda ned JDBC-drivrutin

Den här artikeln innehåller information om hur du utvecklar Java-program som använder Microsoft Entra-autentiseringsfunktionen med Microsoft JDBC-drivrutinen för SQL Server.

Du kan använda Microsoft Entra-autentisering, vilket är en mekanism för att ansluta till Azure SQL Database, Azure SQL Manged Instance och Azure Synapse Analytics med hjälp av identiteter i Microsoft Entra-ID. Använd Microsoft Entra-autentisering för att centralt hantera identiteter för databasanvändare och som ett alternativ till SQL Server-autentisering. Med JDBC-drivrutinen kan du ange dina Microsoft Entra-autentiseringsuppgifter i JDBC-anslutningssträngen för att ansluta till Azure SQL. Information om hur du konfigurerar Microsoft Entra-autentisering finns i Ansluta till Azure SQL med hjälp av Microsoft Entra-autentisering.

Anslutningsegenskaper som stöder Microsoft Entra-autentisering i Microsoft JDBC-drivrutinen för SQL Server är:

  • autentisering: Använd den här egenskapen för att ange vilken SQL-autentiseringsmetod som ska användas för anslutningen. Möjliga värden är:
    • ActiveDirectoryManagedIdentity

      • Eftersom drivrutinsversion 8.3.1 kan authentication=ActiveDirectoryMSI användas för att ansluta till en Azure SQL Database/Synapse Analytics från en Azure-resurs med stöd för identitet aktiverat. Du kan också ange msiClientId i egenskaperna Anslutning/DataSource tillsammans med det här autentiseringsläget. msiClientId måste innehålla klient-ID för en hanterad identitet som ska användas för att hämta accessToken- för att upprätta anslutningen. Sedan drivrutinsversion v12.2 kan authentication=ActiveDirectoryManagedIdentity också användas för att ansluta till en Azure SQL Database/Synapse Analytics från en Azure-resurs där stöd för "Identity" är aktiverat. Du kan också ange klient-ID för en hanterad identitet i egenskapen user. För mer information, se Anslut med autentiseringsläget ActiveDirectoryManagedIdentity.
    • ActiveDirectoryDefault

      • Eftersom drivrutinsversion 12.2 kan authentication=ActiveDirectoryDefault användas för att ansluta till Azure SQL/Synapse Analytics via StandardAzureCredential- från Azure Identity-klientbiblioteket. Mer information finns i Anslut med autentiseringsläget ActiveDirectoryDefault.
    • ActiveDirectoryIntegrerad

      • Eftersom drivrutinsversion 6.0 kan authentication=ActiveDirectoryIntegrated användas för att ansluta till Azure SQL/Synapse Analytics via integrerad autentisering. Om du vill använda det här autentiseringsläget måste du federera lokala Active Directory Federation Services (ADFS) med Microsoft Entra-ID i molnet. När du har konfigurerat det kan du ansluta genom att antingen lägga till det interna biblioteket mssql-jdbc_auth-<version>-<arch>.dll till programklasssökvägen i Windows eller genom att konfigurera en Kerberos-biljett för plattformsoberoende autentiseringsstöd. Du kan komma åt Azure SQL/Azure Synapse Analytics utan att behöva ange autentiseringsuppgifter när du är inloggad på en domänansluten dator. Mer information finns i Anslut med autentiseringsläget ActiveDirectoryIntegrated.
    • Active Directory-lösenord

      • Från och med drivrutinsversion 6.0 kan authentication=ActiveDirectoryPassword användas för att ansluta till Azure SQL/Synapse Analytics med användarnamn och lösenord för Microsoft Entra. För mer information, se Anslut med autentiseringsläget ActiveDirectoryPassword.
    • ActiveDirectoryInteractive

      • Eftersom drivrutinsversion 9.2 kan authentication=ActiveDirectoryInteractive användas för att ansluta till ett Azure SQL/Synapse Analytics via interaktivt autentiseringsflöde (multifaktorautentisering). Mer information finns i Anslut med ActiveDirectoryInteractive-autentiseringsläge.
    • ActiveDirectoryServicePrincipal

      • Sedan drivrutinsversion 9.2 kan authentication=ActiveDirectoryServicePrincipal användas för att ansluta till Azure SQL/Synapse Analytics genom att ange program-/klient-ID:t i egenskapen "userName" och ange hemligheten för en tjänsthuvudnamnsidentitet i egenskapen "lösenord". Mer information finns under Anslut med autentiseringsläget ActiveDirectoryServicePrincipal.
    • ActiveDirectoryServicePrincipalCertificate

      • Sedan drivrutinsversion 12.4 kan authentication=ActiveDirectoryServicePrincipalCertificate användas för att ansluta till en Azure SQL Database/Synapse Analytics genom att ange program-/klient-ID i egenskapen användarnamn och platsen för tjänstens huvudkontos certifikat i egenskapen clientCertificate. Mer information finns i Anslut med ActiveDirectoryServicePrincipalCertificate-autentiseringsläge.
    • SqlPassword

      • Använd authentication=SqlPassword för att ansluta till en SQL Server med hjälp av egenskaperna userName/user och password.
    • EjSpecificerad

      • Använd authentication=NotSpecified eller lämna den som standard när ingen av dessa autentiseringsmetoder behövs.
    • accessToken: Använd den här anslutningsegenskapen för att ansluta till en SQL Database med åtkomsttoken. accessToken kan bara anges med parametern Egenskaper för metoden getConnection() i klassen DriverManager. Den kan inte användas i anslutnings-URL:en.

Mer information finns i autentiseringsegenskapen på sidan Ange anslutningsegenskaper.

Krav för klientkonfiguration

Förutom den grundläggande drivrutinen Systemkravhar följande autentiseringslägen fler krav.

I följande tabell visas nödvändiga biblioteksberoenden för varje autentiseringsläge och drivrutinsversion. Beroenden av beroenden krävs också.

Not

I de fall där snabbkorrigeringen för en större version har en annan beroendeversion än huvudversionen visas även snabbkorrigeringen.

Autentiseringsalternativ Drivrutinsversioner Biblioteksberoenden
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

Ansluta med autentiseringsläget ActiveDirectoryManagedIdentity

Det här autentiseringsläget stöds från och med version 7.2. Om du vill använda den anger du authentication=ActiveDirectoryMSI. Från och med version 12.2 kan authentication=ActiveDirectoryManagedIdentity också anges.

Förutom de biblioteksberoendekrav som anges i krav för klientkonfigurationhar den här funktionen följande krav:

I följande exempel visas hur du använder authentication=ActiveDirectoryManagedIdentity läge. Kör det här exemplet inifrån en Azure-resurs som har konfigurerats för hanterad identitet.

Om du vill köra exemplet, ersätt server-/databasnamnet med ditt server-/databasnamn på de följande raderna.

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

Exemplet för att använda ActiveDirectoryMSI autentiseringsläge:

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

I följande exempel visas hur du använder authentication=ActiveDirectoryManagedIdentity läge.

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

De här exemplen på en virtuell Azure-dator hämtar en åtkomsttoken från systemtilldelad hanterad identitet eller användartilldelad hanterad identitet (om msiClientId eller user anges med ett klient-ID för en hanterad identitet) och upprättar en anslutning med hjälp av den hämtade åtkomsttoken. Om en anslutning upprättas bör du se följande meddelande:

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

Ansluta med autentiseringsläget ActiveDirectoryDefault

Autentiseringsalternativet ActiveDirectoryDefault använder Azure Identity-klientbibliotekets DefaultAzureCredential kedjade TokenCredential-implementering. Autentiseringsuppgifterna kombinerar vanliga autentiseringsmetoder som är sammanlänkade.

ActiveDirectoryDefault-autentisering kräver ett körtidsberoende av Azure Identity-klientbiblioteket för Hanterad Identitet. Information om biblioteksversion finns i Krav för klientkonfiguration.

I följande tabell visas DefaultAzureCredential autentiseringskedja för varje JDBC-drivrutinsversion.

Drivrutinsversion azure-identitetsversion DefaultAzureCredential kedja
12.2 azure-identity 1.7.0 Miljö
Hanterad identitet
IntelliJ
Azure CLI
Azure PowerShell
12.4 azure-identity 1.9.0 Miljö
Arbetsbelastningsidentitet
Hanterad identitet
Azure Developer CLI
IntelliJ
Azure CLI
Azure PowerShell
12.6 azure-identity 1.11.1 Miljö
Arbetslastidentitet
Hanterad identitet
Azure Developer CLI
IntelliJ
Azure CLI
Azure PowerShell
12.8 azure-identity 1.12.2 Miljö
Arbetslastidentitet
Hanterad identitet
Azure Developer CLI
IntelliJ
Azure CLI
Azure PowerShell
12.10 azure-identity 1.15.3 Miljö
Arbetsbelastningsidentitet
Hanterad identitet
Azure Developer CLI
IntelliJ
Azure CLI
Azure PowerShell

Det finns många variabler som kan ställas in för att konfigurera Environment autentiseringsuppgifter. Mer information om hur du konfigurerar DefaultAzureCredential-kedjan, inklusive Environment autentiseringsuppgifter, finns i relevant version av azure-identity-dokumenten som är länkade i föregående tabell.

Om du vill använda IntellijCredential i Windows anger du miljövariabeln INTELLIJ_KEEPASS_PATH till platsen för filen keepass. Till exempel INTELLIJ_KEEPASS_PATH=C:\user\your\path\to\the\keepass\file.

Om du vill ge fler klienter till DefaultAzureCredentialanvänder du miljövariabeln ADDITIONALLY_ALLOWED_TENANTS. Den här variabeln tar en kommaavgränsad lista. Till exempel ADDITIONALLY_ALLOWED_TENANTS=<your-tenant-id-0>,<your-tenant-id-1>,<your-tenant-id-2>,...

I det följande exemplet visas hur du använder authentication=ActiveDirectoryDefault-läget med AzureCliCredential i DefaultAzureCredential.

  1. Logga först in på Azure CLI med följande kommando.

    az login
    
  2. När du har loggat in på Azure CLI kör du följande kod.

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

Ansluta med ActiveDirectoryIntegrated-autentiseringsläge

Det finns två sätt att använda ActiveDirectoryIntegrated autentisering i Microsoft JDBC-drivrutinen för SQL Server:

  • På Windows kan mssql-jdbc_auth-<version>-<arch>.dll från det nedladdade paketet kopieras till en plats inom systemsökvägen.
  • Om du inte kan använda DLL:n, från och med version 6.4, kan du konfigurera en Kerberos-biljett. Den här metoden stöds på flera plattformar (Windows, Linux och macOS). För mer information, se Ställ in Kerberos-biljett på Windows, Linux och macOS.

Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.

I följande exempel visas hur du använder authentication=ActiveDirectoryIntegrated läge. Det här exemplet körs på en domänansluten dator som är federerad med Microsoft Entra-ID. En databasanvändare som representerar din Windows-användare måste finnas i databasen och måste ha behörigheten ANSLUT.

Ersätt server-/databasnamnet med namnet på servern/databasen på följande rader innan du kör exemplet:

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

Exemplet för att använda ActiveDirectoryIntegrated-autentiseringsläge:

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

Om du kör det här exemplet används din Kerberos-biljett automatiskt från klientplattformen och inget lösenord krävs. Om en anslutning upprättas bör du se följande meddelande:

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

Ange Kerberos-biljett i Windows, Linux och macOS

Du måste skapa en Kerberos-biljett för att länka den aktuella användaren till ett Windows-domänkonto. Följande är en sammanfattning av de viktigaste stegen.

Windows

Nota

I Windows kan mssql-jdbc_auth-<version>-<arch>.dll från det nedladdade paketet användas i stället för de här Kerberos-konfigurationsstegen. De här stegen krävs bara om du inte kan använda DLL:en.

JDK levereras med kinit, som du kan använda för att hämta en TGT från Key Distribution Center (KDC) på en domänansluten dator som är federerad med Microsoft Entra-ID.

Steg 1: Hämtning av biljettbeviljande biljett
  • Körs på: Windows

  • åtgärd:

    • Använd kommandot kinit username@DOMAIN.COMPANY.COM för att hämta en TGT från KDC och sedan uppmanas du att ange ditt domänlösenord.
    • Använd klist för att se tillgängliga biljetter. Om kinit lyckades bör du se en biljett från krbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM.

    Not

    Du kan behöva ange en .ini fil med -Djava.security.krb5.conf för att programmet ska kunna hitta KDC.

Linux och macOS

Krav

Åtkomst till en Windows-domänansluten dator för att fråga kerberos-domänkontrollanten.

Steg 1: Hitta Kerberos KDC
  • Kör på: Windows-kommandorad

  • Åtgärd: nltest /dsgetdc:DOMAIN.COMPANY.COM (där DOMAIN.COMPANY.COM mappar till domänens namn)

  • Exempel på utdata

    DC: \\co1-red-dc-33.domain.company.com
    Address: \\2111:4444:2111:33:1111:ecff:ffff:3333
    ...
    The command completed successfully
    
  • Information för att extrahera DC-namnet, i det här fallet co1-red-dc-33.domain.company.com

Steg 2: Konfigurera KDC i krb5.conf
  • Kör på: Linux/macOS

  • Åtgärd: Redigera /etc/krb5.conf i valfri redigerare. Konfigurera följande nycklar

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

    Spara sedan filen krb5.conf och avsluta

    Not

    Domänen måste finnas i ALL CAPS.

Steg 3: Testa biljetten som beviljar biljetthämtning
  • Kör på: Linux/macOS
  • åtgärd:
    • Använd kommandot kinit username@DOMAIN.COMPANY.COM för att hämta en TGT från KDC och sedan uppmanas du att ange ditt domänlösenord.
    • Använd klist för att se tillgängliga biljetter. Om kinit lyckades bör du se en biljett från krbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM.

Ansluta med autentiseringsläget ActiveDirectoryPassword

I följande exempel visas hur du använder authentication=ActiveDirectoryPassword läge.

Så här skapar och kör du exemplet:

  1. Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.

  2. Leta upp följande kodrader och ersätt server-/databasnamnet med ditt server-/databasnamn.

    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. Leta upp följande kodrader. Ersätt användarnamnet med namnet på den Microsoft Entra-användare som du vill ansluta som.

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

Exemplet för att använda ActiveDirectoryPassword autentiseringsläge:

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

Om anslutningen upprättas bör du se följande meddelande som utdata:

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

Ansluta med ActiveDirectoryInteractive-autentiseringsläge

I följande exempel visas hur du använder authentication=ActiveDirectoryInteractive läge.

Så här skapar och kör du exemplet:

  1. Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.

  2. Leta upp följande kodrader och ersätt server-/databasnamnet med ditt server-/databasnamn.

    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. Leta upp följande kodrader. Ersätt användarnamnet med namnet på den Microsoft Entra-användare som du vill ansluta som.

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

Exemplet för att använda ActiveDirectoryInteractive autentiseringsläge:

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

När du kör programmet visas en webbläsare för att autentisera användaren. Exakt vad du ser beror på hur du konfigurerar ditt Microsoft Entra-ID. Det kan eller kanske inte innehålla uppmaningar om multifaktorautentisering för användarnamn, lösenord, PIN-kod eller autentisering av andra enheter via en telefon. Om flera interaktiva autentiseringsbegäranden görs i samma program kanske senare begäranden inte ens frågar dig om autentiseringsbiblioteket kan återanvända en tidigare cachelagrad autentiseringstoken.

Information om hur du konfigurerar Microsoft Entra-ID för att kräva multifaktorautentisering finns i Komma igång med Microsoft Entra multifaktorautentisering i molnet.

Skärmbilder av dessa dialogrutor finns i Using Microsoft Entra multifactor authentication.

Om användarautentiseringen har slutförts bör du se följande meddelande i webbläsaren:

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

Det här meddelandet anger bara att användarautentiseringen lyckades, men inte nödvändigtvis en lyckad anslutning till servern. När du återvänder till programmet bör du se följande meddelande som utdata om en anslutning upprättas till servern:

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

Ansluta med autentiseringsläget ActiveDirectoryServicePrincipal

I följande exempel visas hur du använder authentication=ActiveDirectoryServicePrincipal läge.

Så här skapar och kör du exemplet:

  1. Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.

  2. Leta upp följande kodrader och ersätt server-/databasnamnet med ditt server-/databasnamn.

    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. Leta upp följande kodrader. Ersätt värdet för principalId med program-ID/klient-ID för huvudansvarig för Microsoft Entras tjänst som du vill ansluta som. Ersätt värdet för principalSecret med hemligheten.

    String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID.
    String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
    
  4. Ange huvud-ID och huvudhemlighet med hjälp av setUser och setPassword i version 10.2 och senare samt setAADSecurePrincipalId och setAADSecurePrincipalSecret i version 9.4 och senare.

Exemplet för att använda ActiveDirectoryServicePrincipal autentiseringsläge:

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

Om en anslutning upprättas bör du se följande meddelande som utdata:

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

Ansluta med autentiseringsläget ActiveDirectoryServicePrincipalCertificate

I följande exempel visas hur du använder authentication=ActiveDirectoryServicePrincipalCertificate läge.

Så här skapar och kör du exemplet:

  1. Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.

  2. Hitta följande kodrader och ersätt server-/databasnamnet med ditt server-/databasnamn.

    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. Leta upp följande kodrader. Ersätt värdet för principalId med program-ID/klient-ID för Microsoft Entra-tjänsthuvudnamn som du vill använda för att ansluta. Ersätt värdet för clientCertificate med platsen där service-principalcertifikatet finns.

    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. Om det tidigare nämnda certifikatet behöver ett lösenord anger du huvudhemligheten med setPassword i version 10.2 och uppåt eller setAADSecurePrincipalSecret i version 9.4 och senare.

  5. Om certifikatet har en associerad privat nyckel anger du den privata nyckeln med hjälp av setClientKey. Om den här nyckeln kräver ett lösenord anger du lösenordet för den privata nyckeln med hjälp av setClientKeyPassword.

Exemplet för att använda ActiveDirectoryServicePrincipalCertificate autentiseringsläge:

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

Om en anslutning upprättas bör du se följande meddelande som utdata:

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

Ansluta med hjälp av åtkomsttoken

Program/tjänster kan hämta en åtkomsttoken från Microsoft Entra-ID och använda den för att ansluta till Azure SQL Database, Azure SQL Managed Instance och Azure Synapse Analytics.

Obs

accessToken kan bara anges med parametern Egenskaper för metoden getConnection() i klassen DriverManager. Den kan inte användas i anslutningssträngen. Från och med drivrutinsversion 12.2 kan användarna implementera och tillhandahålla en accessToken callback till drivrutinen för förnyelse av tokens vid anslutningspoolsscenarier. Scenarier för anslutningspooler kräver att implementeringen av anslutningspoolen använder standardklasserna JDBC-anslutningspooler.

Följande exempel innehåller ett enkelt Java-program som ansluter till Azure med åtkomsttokenbaserad autentisering.

Så här skapar och kör du exemplet:

  1. Skapa ett programkonto i Microsoft Entra-ID för din tjänst.

    1. Logga in på Azure-portalen.
    2. Gå till Microsoft Entra-ID i det vänstra navigeringsfältet.
    3. Välj App-registreringar.
    4. Välj Ny registrering.
    5. Ange mytokentest som ett vänligt namn för programmet.
    6. Lämna standardvalet för kontotyper som stöds, som kan använda programmet.
    7. Välj Registrera längst ned.
    8. URL SIGN-ON behövs inte. Ange vad som helst: https://mytokentest.
    9. Välj Create längst ned.
    10. När du väljer Registreraskapas appen omedelbart och du tas till dess resurssida.
    11. I rutan Essentials hittar du Application (klient)-ID:t och kopierar det. Du behöver det här värdet senare för att konfigurera programmet.
    12. Välj Certifikat & hemligheter från navigeringsfönstret. På fliken Klienthemligheter (0) väljer du Ny klienthemlighet. Ange en beskrivning för hemligheten och välj ett förfallodatum (standardvärdet är bra). Välj Lägg till längst ned. Viktigt innan du lämnar den här sidan, kopiera det genererade Value för din klienthemlighet. Det går inte att visa det här värdet när du har lämnat sidan. Det här värdet är klienthemligheten.
    13. Gå tillbaka till fönstret Appregistreringar för Microsoft Entra-ID och leta reda på fliken Slutpunkter. Kopiera URL:en under OAuth 2.0 token endpoint. Den här URL:en är din STS-URL.
  2. Anslut till din databas som Microsoft Entra-administratör och använd ett T-SQL-kommando för att etablera en innesluten databasanvändare för din applikationshuvudman. Mer information om hur du skapar en Microsoft Entra-administratör och en innesluten databasanvändare finns i Ansluta med hjälp av Microsoft Entra-autentisering.

    CREATE USER [mytokentest] FROM EXTERNAL PROVIDER
    
  3. På den klientdator där du kör exemplet laddar du ned Microsoft Authentication Library (MSAL) för Java-biblioteket och dess beroenden. MSAL krävs bara för att köra det här specifika exemplet. I exemplet används API:erna från det här biblioteket för att hämta åtkomsttoken från Microsoft Entra-ID. Om du redan har en åtkomsttoken kan du hoppa över det här steget och ta bort avsnittet i exemplet som hämtar en åtkomsttoken.

I följande exempel ersätter du STS-URL:en, klient-ID, klienthemlighet, server- och databasnamn med dina värden.

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

Om anslutningen lyckas bör du se följande meddelande som utdata:

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

Ansluta med hjälp av återanrop till åtkomsttoken

Precis som egenskapen för åtkomsttoken kan du registrera en metod som ger drivrutinen en åtkomsttoken. Fördelen med det här återanropet över egenskapen är att återanropet gör att drivrutinen kan begära en ny åtkomsttoken när token har upphört att gälla. En anslutningspool som skapar en ny anslutning kan till exempel begära en ny token med ett nytt förfallodatum. Mer information finns i Använda anslutningspooler.

I följande exempel visas hur du implementerar och ställer in accessToken-återanropet.

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

Om anslutningen lyckas bör du se följande meddelande som utdata:

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

Från och med version 12.4 kan accessToken-återanrop ställas in via anslutningssträngens egenskap accessTokenCallbackClass. I följande exempel visas hur du anger accessToken återanrop med den här egenskapen:

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

Om anslutningen lyckas bör du se följande meddelande som utdata:

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

Nästa steg

Läs mer om relaterade begrepp i följande artiklar: