azure-sql-database - Azure SQL 和 AAD 身份验证
问题描述
Azure SQL 是否支持通过 AAD 客户端 ID 和密钥进行访问?如果是,那么授予对 AAD ClientId 访问权限的 TSQL 是什么,我可以使用 SSMS 通过 AAD 客户端和密钥连接到 Azure SQL 吗?
解决方案
是的,您可以使用访问令牌(AD 令牌)
应用程序/服务可以从 Azure Active Directory 检索访问令牌并使用它连接到 SQL Azure 数据库。
http://mytokentest
在注册您的 APP 时在 signonURL 中 提供任何东西( )CREATE USER [mytokentest] FROM EXTERNAL PROVIDER
在客户端应用程序中尝试以下代码
public static void main(String[] args) throws Exception {
// Retrieve the access token from the AD.
String spn = "https://database.windows.net/";
String stsurl = "https://login.microsoftonline.com/..."; // Replace with your STS URL.
String clientId = "1846943b-ad04-4808-aa13-4702d908b5c1"; // Replace with your client ID.
String clientSecret = "..."; // Replace with your client secret.
AuthenticationContext context = new AuthenticationContext(stsurl, false, Executors.newFixedThreadPool(1));
ClientCredential cred = new ClientCredential(clientId, clientSecret);
Future<AuthenticationResult> future = context.acquireToken(spn, cred, null);
String accessToken = future.get().getAccessToken();
System.out.println("Access Token: " + accessToken);
// Connect with the access token.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("aad-managed-demo.database.windows.net"); // Replace with your server name.
ds.setDatabaseName("demo"); // Replace with your database name.
ds.setAccessToken(accessToken);
ds.setHostNameInCertificate("*.database.windows.net");
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));
}
}
}
- 向 Azure Active Directory 注册应用程序并获取代码的客户端 ID。
- 创建代表应用程序的数据库用户。(在前面的第 6 步中完成。)
- 在客户端计算机上创建证书运行应用程序
- 将证书添加为您的应用程序的密钥。
推荐阅读
- javascript - 将空格分隔的坐标字符串转换为 JavaScript 对象数组
- bluetooth - STM32MP1 上的 Bluez 连接
- python - 如何让滚动条在 tkinter 上与框架上的对象一起工作?
- python - 使用 succes 消息混合,Django 消息无法正常工作
- android - java.lang.IllegalStateException: 必须在调用 loadAd 之前设置广告尺寸和广告单元 ID。?
- ngxs - NXGS 警告“在 '@ngxs/store' 中找不到导出 'StateContext'”
- javascript - 如何使用 JS 将表单中的多个输入显示/打印为表格?
- r - 具有 abline 函数的散点图与 Spearman 的 rho 不匹配
- python - 为什么变压器不接受任何论点?
- numpy - 创建一个长度未知的多维数组