com.microsoft.sqlserver.jdbc.SQLServerException: сбой токена MSI: не удалось получить токен из конечной точки MSI

Я хочу получить доступ к базе данных SQL Azure с помощью API службы приложений (Java) с проверкой подлинности MSI (Managed Service Identity).

Я пытаюсь узнать, как подключить Azure sql к MSI из службы приложений Azure для Java.

Вот строка подключения, которую я использую.

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

Вот шаги, которые я использовал:

  1. Создать группу AAD
  2. Добавить MI (управляемое удостоверение) веб-приложения Azure в эту группу 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.


person Ammanuel g    schedule 10.09.2019    source источник
comment
Вы добавили службу приложения в базу данных SQL с помощью контроля доступа? Ссылка: docs.microsoft.com/en-us/azure/active-directory/ [Эта ссылка относится к ВМ, но точно так же вы можете предоставить доступ для службы своего приложения]   -  person Anish K    schedule 10.09.2019
comment
Да. Я включил шаги, которым следовал.   -  person Ammanuel g    schedule 10.09.2019
comment
@Ammanuelg Вы пробовали это руководство Подключение с использованием режима аутентификации ActiveDirectoryMSI?   -  person Leon Yue    schedule 11.09.2019
comment
Я попробовал код по ссылке, где рекомендует @LeonYue, но у меня такая же проблема.   -  person Ammanuel g    schedule 11.09.2019
comment
Вы уже нашли решение? Я пытаюсь сделать то же самое, но получаю ту же ошибку   -  person Joost Luijben    schedule 16.05.2020
comment
Проблема заключалась в том, что последняя версия библиотеки mssql-jdbc (6.x) на тот момент не поддерживала аутентификацию MSI. Microsoft исправила проблему в своей версии 7.0.x, и теперь она работает нормально. Последняя версия библиотеки mssql-jdbc поддерживает аутентификацию MSI.   -  person Ammanuel g    schedule 18.05.2020
comment
@Ammanuelg Я сделал то же самое, что и в ответе Джека, но все равно получаю ту же ошибку. Я использую версию драйвера mssql-jdbc 7.2.1.jre11. Я тоже пробовал 8.2.2.jre11, но это тоже не сработало.   -  person Joost Luijben    schedule 19.05.2020
comment
@JoostLuijben, жаль это слышать. Вокруг Azure SQL, включая виртуальную сеть, может быть брандмауэр. Я могу помочь вам, если вы поделитесь фрагментом кода, Azure SQL Server и конфигурацией базы данных, включая сеть (виртуальная сеть, подсеть, ...).   -  person Ammanuel g    schedule 23.05.2020


Ответы (2)


Я тестировал локально и добился успеха. Вот мои шаги для вашей справки:

1. Включите управляемую идентификацию для своего веб-приложения, приложения-функции или виртуальной машины.

Здесь я буду использовать приложение-функцию.

введите здесь описание изображения

а затем установите статус на и сохраните. И вы получите идентификатор объекта.

введите здесь описание изображения

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:

введите здесь описание изображения

person Jack Jia    schedule 16.09.2019
comment
Спасибо за подробности шагов. Я использую веб-приложение Azure вместо функции Azure. В любом случае я попробую. - person Ammanuel g; 16.09.2019
comment
Что нужно сделать, чтобы локальные машины достигли того же. Здесь я разместил свой вопрос. Буду очень признателен, если вы, @Jack jia, или кто-то ответит. Вот сообщение о слабости: stackoverflow.com/questions/62513972/ - person Ajay Kumar Jaiswal; 22.06.2020

Я работал с командами Microsoft, и они подтвердили, что проблема с библиотекой JDBC (mssql-jdbc), и работают над этим исправлением. У меня есть изменение, чтобы протестировать их предварительную библиотеку JDBC, и она работает должным образом. Так что следующий выпуск библиотеки JDBC решит эту проблему.

person Ammanuel g    schedule 10.10.2019