1

我想使用带有 MSI(托管服务标识)身份验证的应用服务 API(Java)访问 Azure SQL 数据库。

我正在尝试找出如何将 Azure sql 与用于 Java 的 Azure App 服务的 MSI 连接起来。

这是我正在使用的连接字符串。

jdbc:sqlserver://mysqldb.database.windows.net:1433;database=TestDB;Authentication=ActiveDirectoryMsi;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;

这是我使用的步骤:

  1. 创建 AAD 组
  2. 将 Azure Web 应用的 MI(托管标识)添加到此 AAD 组
  3. 将此组作为 Active Directory 管理员添加到 Azure SQL Server
  4. 为该组创建用户并赋予角色。

    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];
    
  5. JDBC 驱动程序的连接字符串。

4

2 回答 2

3

我在本地测试并获得了成功。以下是我的步骤供您参考:

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:

在此处输入图像描述

于 2019-09-16T02:48:25.750 回答
1

我正在与 Microsoft 团队合作,他们确认 JDBC 库(mssql-jdbc)是问题所在,他们正在努力解决这个问题。我有一个更改来测试他们的预览 JDBC 库,它按预期工作。所以 JDBC 库的下一个版本将解决它。

于 2019-10-10T13:41:01.820 回答