通过Java JDBC使用支持MFA的Azure AD通用认证连接SQL Server
实现Java项目通过Azure AD通用MFA认证连接SQL Server
前置准备
- 确认SQL Server已配置Azure AD认证并启用MFA
- 安装Microsoft JDBC Driver for SQL Server(版本≥9.2,确保支持Azure AD MFA特性)
- 在Azure AD中注册Java应用,获取
客户端ID,并为应用授予Azure SQL Database的必要访问权限(如User.Read)
分步实现
1. 添加Maven依赖
在pom.xml中引入JDBC驱动:
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>12.4.1.jre11</version> <!-- 推荐使用最新稳定版 --> </dependency>
2. 配置连接字符串
Azure AD通用MFA认证的核心连接参数:
authentication=ActiveDirectoryInteractive:指定交互式MFA认证模式encrypt=true:强制加密连接(Azure AD认证要求)hostNameInCertificate=*.database.windows.net:Azure SQL DB的证书验证规则(本地SQL Server集成Azure AD需对应调整)server:SQL Server地址(如your-sql-server.database.windows.net)database:目标数据库名称
示例连接字符串:
String connectionUrl = "jdbc:sqlserver://your-sql-server.database.windows.net:1433;" + "databaseName=your-db-name;" + "authentication=ActiveDirectoryInteractive;" + "encrypt=true;" + "hostNameInCertificate=*.database.windows.net;" + "clientId=your-azure-ad-app-client-id;";
3. 编写连接代码
交互式MFA会弹出认证窗口,引导用户完成账号输入及MFA验证(如短信、Authenticator应用):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class AzureADMfaSqlConnector { public static void main(String[] args) { String connectionUrl = "jdbc:sqlserver://your-sql-server.database.windows.net:1433;" + "databaseName=your-db-name;" + "authentication=ActiveDirectoryInteractive;" + "encrypt=true;" + "hostNameInCertificate=*.database.windows.net;" + "clientId=your-azure-ad-app-client-id;"; try (Connection conn = DriverManager.getConnection(connectionUrl); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT @@VERSION")) { while (rs.next()) { System.out.println("SQL Server版本: " + rs.getString(1)); } System.out.println("MFA认证连接成功!"); } catch (Exception e) { e.printStackTrace(); } } }
4. 非交互式场景适配(可选)
如果是后台服务无法弹出交互窗口,可选择两种方案:
- 服务主体证书认证:无需用户MFA,通过Azure AD服务主体的证书完成认证
- ActiveDirectoryPassword模式:用户输入密码,MFA通过预设渠道(如短信)触发,连接字符串示例:
String connectionUrl = "jdbc:sqlserver://your-sql-server.database.windows.net:1433;" + "databaseName=your-db-name;" + "authentication=ActiveDirectoryPassword;" + "encrypt=true;" + "hostNameInCertificate=*.database.windows.net;" + "user=your-aad-user@your-domain.onmicrosoft.com;" + "password=your-user-password;";
关键配置说明
clientId:必须与Azure AD注册应用的ID完全匹配,否则认证流程会失败encrypt=true:Azure AD认证强制要求加密连接,缺失会导致连接报错hostNameInCertificate:用于验证SQL Server SSL证书,防止中间人攻击,需根据部署环境调整
最佳实践
- 始终使用最新版JDBC驱动,获取兼容性修复和安全更新
- 敏感信息(如clientId、密码)避免硬编码,改用环境变量或配置中心存储
- 无界面服务器场景优先使用服务主体证书认证,替代交互式MFA
- Azure AD应用权限遵循最小权限原则,仅授予必要的SQL访问权限
- 捕获并处理认证异常(如MFA验证失败、权限不足),提供明确的错误提示
内容的提问来源于stack exchange,提问作者sree_me
相关产品推荐
相关产品推荐

