com.microsoft.sqlserver.jdbc.SQLServerException:MSI令牌失败:无法从MSI端点获取令牌

时间:2019-09-10 16:40:11

标签: java sql azure mssql-jdbc adal4j

我想使用具有MSI(托管服务身份)身份验证的App Service API(Java)访问Azure SQL数据库。

我正在尝试查找如何通过适用于Java的Azure应用服务将Azure sql与MSI连接起来。

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

  

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

这是我使用的步骤:

  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驱动程序的连接字符串。

2 个答案:

答案 0 :(得分:0)

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

1。为您的Web应用程序,功能应用程序或VM启用托管身份

在这里,我将使用功能应用程序。

enter image description here

,然后将状态设置为开并保存。然后您将获得一个对象ID。

enter image description here

2。创建一个Azure AD组,并将身份添加为成员

enter image description here

3。在门户上配置Azure SQL Server

enter image description here

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:

enter image description here

答案 1 :(得分:0)

我正在与Microsoft团队合作,他们确认JDBC库(mssql-jdbc)是问题所在,并且他们正在研究此修复程序。我进行了更改以测试其预览JDBC库,并且按预期工作。因此,下一版JDBC库将解决该问题。