Ansluta med Microsoft Entra-autentisering
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 kanauthentication=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 egenskapenuser
. För mer information, se Anslut med autentiseringsläget ActiveDirectoryManagedIdentity.
- Eftersom drivrutinsversion 8.3.1 kan
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.
- Eftersom drivrutinsversion 12.2 kan
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 biblioteketmssql-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.
- Eftersom drivrutinsversion 6.0 kan
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.
- Från och med drivrutinsversion 6.0 kan
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.
- Eftersom drivrutinsversion 9.2 kan
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.
- Sedan drivrutinsversion 9.2 kan
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 egenskapenclientCertificate
. Mer information finns i Anslut med ActiveDirectoryServicePrincipalCertificate-autentiseringsläge.
- Sedan drivrutinsversion 12.4 kan
SqlPassword
- Använd
authentication=SqlPassword
för att ansluta till en SQL Server med hjälp av egenskaperna userName/user och password.
- Använd
EjSpecificerad
- Använd
authentication=NotSpecified
eller lämna den som standard när ingen av dessa autentiseringsmetoder behövs.
- Använd
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 metodengetConnection()
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.3Client-Runtime-for-AutoRest 1.6.5 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
7.4 - 8.2 |
Adal4j l4j 1.6.4Client-Runtime-for-AutoRest 1.7.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated |
8.4 |
Adal4j 1.6.5Client-Runtime-for-AutoRest 1.7.4 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
9.2 |
msal4j 1.7.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
9.4 |
msal4j 1.10.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
10.2 |
msal4j 1.11.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
11.2 |
msal4j 1.11.3 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
11.2.3 |
msal4j 1.13.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal |
12.2 |
msal4j 1.13.3 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.2 |
azure-identity 1.7.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.4 |
msal4j 1.13.8 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.4 |
azure-identity 1.9.0 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12,6 |
msal4j 1.14.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.6 |
azure-identity 1.11.1 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.6.3 |
msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.6.3 |
azure-identity 1.12.2 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.6.4 |
msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.6.4 |
azure-identity 1.12.2 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate |
12.8 |
msal4j 1.15.1 |
ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.8 |
azure-identity 1.12.2 |
ActiveDirectoryPassword ActiveDirectoryIntegrated ActiveDirectoryInteractive ActiveDirectoryServicePrincipal ActiveDirectoryServicePrincipalCertificate ActiveDirectoryManagedIdentity ActiveDirectoryMSI ActiveDirectoryDefault |
12.10 |
azure-identity 1.15.3 |
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:
Måldatabasen måste ha en innesluten databasanvändare med CONNECT-behörighet. Den inneslutna användaren måste representera din Azure-resurss systemtilldelade hanterade identitet eller användartilldelade hanterade identitet, eller någon av de grupper som din hanterade identitet tillhör.
Klientmiljön måste vara en Azure-resurs och funktionen "Identitet" måste vara aktiverad. I följande tabell visas Azure-tjänster som stöds av varje JDBC-drivrutinsversion:
Drivrutinsversion Nödvändiga beroenden Azure-tjänster som stöds 7.2 - 11.2 Ingen Azure App Service och Azure Functions
Azure Virtual Machines12.2
12.4
12.6
12.8
12.10azure-identity
1.7.0
azure-identity
1.9.0
azure-identity
1.11.1
azure-identity
1.12.2
azure-identity
1.15.3Azure App Service och Azure Functions
Azure Arc
Azure Cloud Shell
Azure Kubernetes Service
Azure Service Fabric
Azure Virtual Machines
Skalningsuppsättningar för virtuella Azure-datorer
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 DefaultAzureCredential
anvä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
.
Logga först in på Azure CLI med följande kommando.
az login
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ånkrbtgt/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.- Använd kommandot
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ärDOMAIN.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 avslutaNot
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ånkrbtgt/DOMAIN.COMPANY.COM@ DOMAIN.COMPANY.COM
.
- Använd kommandot
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:
Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.
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
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:
Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.
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
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:
Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.
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
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örprincipalSecret
med hemligheten.String principalId = "<service_principal_guid>"; // Replace with your Microsoft Entra service principal ID. String principalSecret = "..."; // Replace with your Microsoft Entra principal secret.
Ange huvud-ID och huvudhemlighet med hjälp av
setUser
ochsetPassword
i version 10.2 och senare samtsetAADSecurePrincipalId
ochsetAADSecurePrincipalSecret
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:
Kontrollera att du har de beroende bibliotek som krävs från -klientens konfigurationskrav.
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
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örclientCertificate
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.
Om det tidigare nämnda certifikatet behöver ett lösenord anger du huvudhemligheten med
setPassword
i version 10.2 och uppåt ellersetAADSecurePrincipalSecret
i version 9.4 och senare.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 avsetClientKeyPassword
.
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:
Skapa ett programkonto i Microsoft Entra-ID för din tjänst.
- Logga in på Azure-portalen.
- Gå till Microsoft Entra-ID i det vänstra navigeringsfältet.
- Välj App-registreringar.
- Välj Ny registrering.
- Ange
mytokentest
som ett vänligt namn för programmet. - Lämna standardvalet för kontotyper som stöds, som kan använda programmet.
- Välj Registrera längst ned.
- URL SIGN-ON behövs inte. Ange vad som helst:
https://mytokentest
. - Välj
Create
längst ned. - När du väljer Registreraskapas appen omedelbart och du tas till dess resurssida.
- 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.
- 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.
- 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.
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
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: