Запрос базы данных SQL Azure из локальной функции Azure с помощью управляемых удостоверений

Я хочу запросить базу данных SQL Azure из функции Azure, выполняющейся на моем компьютере при отладке с использованием управляемых удостоверений (т. Е. Удостоверения моего пользователя, подключенного к Visual Studio, вместо указания UserId и пароля в строке подключения).

Я следил за этим руководством в документации Microsoft, поэтому у моего Azure SQL Server есть пользователь AD в качестве администратора, что позволило мне предоставить права (db_datareader) группе Azure AD, которую я создал с помощью своего идентификатора функции Azure и моего пользователя в ней (а также моего приложения-функции, развернутого в Лазурный).

Если я разверну и запустил в Azure свою функцию Azure, она сможет запрашивать мою базу данных, и все будет работать нормально. Но когда я запускаю свою функцию Azure локально, у меня возникает следующая ошибка:

Не удалось войти в систему для пользователя NT AUTHORITY \ ANONYMOUS LOGON.

Код моей функции следующий:

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "test")] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");


        using (var connection = new SqlConnection(Environment.GetEnvironmentVariable("sqlConnectionString")))
        {
            connection.AccessToken = await (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net");
            log.LogInformation($"Access token : {connection.AccessToken}");
            try
            {
                await connection.OpenAsync();
                var rows = await connection.QueryAsync<Test>("select top 10 * from TestTable");
                return new OkObjectResult(rows);
            }
            catch (Exception e)
            {
                throw e;
            }

        }
    }

Код правильно извлекает токен, ошибка возникает в строке await connection.OpenAsync().

Если я открою базу данных в Azure Data Studio с тем же пользователем, что и пользователь, подключенный к Visual Studio (который является членом группы AD с правами на базу данных), я могу подключиться и запросить базу данных без каких-либо проблем.

Это известная проблема или мне что-то здесь не хватает?


person TechWatching    schedule 14.08.2019    source источник
comment
Установлена ​​ли переменная среды sqlConnectionString при локальном запуске?   -  person Turbo    schedule 14.08.2019
comment
Да, он установлен в моем local.settings.json файле: sqlConnectionString: Server = tcp: myservername.database.windows.net, 1433; Initial Catalog = mydatabasename ;,   -  person TechWatching    schedule 14.08.2019
comment
Понятно. Единственный раз, когда я видел эту ошибку ранее, был когда я указал имя сервера, но пропустил имя базы данных. (поскольку логины AAD имеют доступ на уровне базы данных, а не на уровне сервера). Но эта ошибка носит довольно общий характер, поэтому не уверен, в чем может быть причина.   -  person Turbo    schedule 14.08.2019
comment
Это могло быть связано с этой проблемой: github.com/Azure/azure- sdk-for-net / issues / 7022   -  person TechWatching    schedule 14.08.2019
comment
Взгляните на токены в обеих средах (Azure и локальной) через jwt.ms и посмотрите, отличаются ли они.   -  person Marc    schedule 15.08.2019
comment
Мои жетоны похожи, только с разными идентификаторами. Однако я заметил, что полученный мной токен не принадлежит правильному пользователю, Visual Studio, похоже, не принимает правильный токен ...   -  person TechWatching    schedule 19.08.2019
comment
Немного взломав этот вопрос ... но есть ли способ сделать это из VSCode (я работаю на Mac), могу ли я установить переменные среды для моих identityobjectid и tennantid или что-то в этом роде?   -  person Mark McGookin    schedule 08.11.2019
comment
Я не пробовал, но думаю, что он должен работать с лазурным кликом. Если вы подключены к Azure cli со своей учетной записью, я думаю, что управляемое удостоверение может это использовать. Сообщите нам, если вам удастся заставить его работать с помощью этого   -  person TechWatching    schedule 08.11.2019


Ответы (2)


Попробовав ваш конкретный сценарий, я протестировал немало способов, чтобы попытаться заставить его работать локально. Это не сработало, и вы получили то же сообщение об ошибке.

Я обсуждал это с некоторыми людьми, когда появилось возможное решение. Протестировал: работает!

Основная проблема в моем случае заключалась в том, что моя подписка (и мой пользователь) - это учетная запись Microsoft (Outlook). По этой причине вам необходимо указать tenantId в вызове GetAccessTokenAsync().

Очевидно, что для управляемых удостоверений не нужно указывать tenantId. Для пользователя рекомендуется явно указать это. В случае личного кабинета MS его указание обязательно.

Мой код (вроде):

var tokenProvider = new AzureServiceTokenProvider();

using (var connection = new SqlConnection(CONNECTIONSTRING))
using (var command = new SqlCommand(QUERY, connection))
{
    connection.AccessToken = await tokenProvider.GetAccessTokenAsync("https://database.windows.net/", "<YOUR_TENANT_ID>");

    await connection.OpenAsync();
    var result = (await command.ExecuteScalarAsync()).ToString();

    return new OkObjectResult(result);
}

Это решение было протестировано и работает как при указании tenantId (или Directory ID, GUID клиента), так и имени onmicrosoft (xxx.onmicrosoft.com).

person rickvdbosch    schedule 19.08.2019
comment
Только что протестировал, работает нормально. Большое спасибо !!! Очевидно, это касается не только учетной записи Microsoft, я использовал учетную запись из другого каталога, который является гостем в каталоге моей базы данных, и у меня была такая же проблема. Я хотел протестировать с другими учетными записями, но по какой-то причине, которую я не понимаю, Visual Studio продолжает использовать ту же учетную запись, что и управляемое удостоверение, независимо от учетной записи, которую я указываю в Visual Studio. - person TechWatching; 20.08.2019

Внесен ли IP-адрес вашего локального компьютера в белый список?

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-firewall-configure

Белый список IP-адресов

person Napoleon Ike Jones    schedule 15.08.2019
comment
Да, в противном случае я бы не смог запросить из Azure Data Studio. Но да, я проверил это, если я использую строку подключения с секретом и паролем, моя функция azure работает хорошо. - person TechWatching; 15.08.2019