我想使用应用服务 API(Java) 和 MSI(托管服务身份)身份验证来访问 Azure SQL 数据库。
我试图找出如何从适用于 Java 的 Azure 应用服务将 Azure sql 与 MSI 连接。
这是我正在使用的连接字符串。
jdbc:sqlserver://mysqldb.database.windows.net:1433;database=TestDB;Authentication=ActiveDirectoryMsi;加密=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
这是我使用的步骤:
- 创建AAD组
- 将 Azure Web 应用程序的 MI(托管身份)添加到此 AAD 组
- 将此组作为 Active Directory 管理员添加到 Azure SQL Server
-
创建用户并为该组分配角色。
CREATE USER [myAADgroup] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [myAADgroup];
ALTER ROLE db_datawriter ADD MEMBER [myAADgroup];
ALTER ROLE db_ddladmin ADD MEMBER [myAADgroup];
JDBC 驱动程序的连接字符串。
我在本地测试了一下,成功了。以下是我的步骤供大家参考:
1. 为您的 Web 应用、函数应用或 VM 启用托管标识
在这里,我将使用函数应用程序。
然后将状态设置为打开并保存。您将获得一个对象 ID。
2.创建Azure AD组,并添加身份为成员
3. 在门户上配置 Azure SQL Server
4. 连接数据库
在这里,我将我的应用程序部署到函数应用程序。例子:
public class Function {
@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(@HttpTrigger(name = "req", methods = {
HttpMethod.GET }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
String result = "";
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("jacksqldemo.database.windows.net"); // Replace with your server name
ds.setDatabaseName("sqldemo"); // Replace with your database name
ds.setAuthentication("ActiveDirectoryMSI");
try (Connection connection = ds.getConnection();
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
if (rs.next()) {
String s = rs.getString(1);
context.getLogger().info("You have successfully logged on as: " + s);
result += "You have successfully logged on as: " + s;
}
}catch(Exception e){
context.getLogger().log(Level.WARNING, e.getMessage(),e);
}
return request.createResponseBuilder(HttpStatus.OK).body(result).build();
}
}
最后,我可以连接到 Azure SQL:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)