我想使用具有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>
这是我使用的步骤:
创建用户并为此群组指定角色。
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驱动程序的连接字符串。
答案 0 :(得分:0)
我在本地测试并获得成功。这是我的步骤供您参考:
在这里,我将使用功能应用程序。
,然后将状态设置为开并保存。然后您将获得一个对象ID。
在这里,我将我的应用程序部署到功能应用程序。样本:
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:
答案 1 :(得分:0)
我正在与Microsoft团队合作,他们确认JDBC库(mssql-jdbc)是问题所在,并且他们正在研究此修复程序。我进行了更改以测试其预览JDBC库,并且按预期工作。因此,下一版JDBC库将解决该问题。