Подключение к Azure SQL из службы приложений с использованием удостоверения AAD - PullRequest
0 голосов
/ 15 ноября 2018

Локальное веб-приложение (.net 4.6.1), которое использует проверку подлинности Windows для своих пользователей, а затем встроенную проверку подлинности AD для подключения к базе данных MS SQL, перенесено в Azure.

В идеале следует сохранить существующий механизм безопасности, предоставляющий разрешения пользователям AD на объектах базы данных и позволяющий БД быть источником безопасности приложения.

Копия базы данных SQL уже создана и настроена.

Если я запускаю веб-приложение локально, но с использованием новой базы данных Azure, все работает как положено.

Если я запускаю эту команду, я получаю ожидаемого пользователя AD:

SELECT CURRENT_USER;

Теперь, когда я развертываю одно и то же приложение в службе приложений Azure и включаю проверку подлинности Azure Active Directory и идентификацию управляемой службы, пользователь правильно проходит проверку подлинности в веб-приложении, но не может подключиться к базе данных SQL и возвращается следующая ошибка:

Errors = System.Data.SqlClient.SqlErrorCollection ClientConnectionId = e9f0c48a-3159-465c-ab72-c1da99761b8f Класс = 14 LineNumber = 65536 Номер = 18456 Процедура = Сервер = xxxxxxxxxxx.tr4.canadacentral1-a.worker.database.windows.net, 11057 State = 1 Source = .Net SqlClient Поставщик данных ErrorCode = -2146232060 Сообщение = Ошибка входа для пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'

Если я отключаю удостоверение управляемой службы, вместо этого я получаю эту ошибку:

InnerExceptions = System.Collections.ObjectModel.ReadOnlyCollection`1 [System.Exception] Сообщение = произошла одна или несколько ошибок. Данные = System.Collections.ListDictionaryInternal InnerException = Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Параметры: Строка подключения: [Строка подключения не указана], Ресурс: https://database.windows.net/, Полномочия:. исключение Сообщение: пробовал следующие 4 способа получить токен доступа, но никто из них не работал. Параметры: Строка соединения: [Нет соединения указанная строка], ресурс: https://database.windows.net/, Полномочия: , Сообщение об исключении: Попытка получить токен с использованием Managed Service Идентичность. Невозможно подключиться к идентификатору управляемой службы (MSI) конечная точка. Убедитесь, что вы используете ресурс Azure, который имеет настройку MSI. Параметры: Строка подключения: [Строка подключения отсутствует указано], ресурс: https://database.windows.net/, Полномочия:. Сообщение об исключении: Попытка получить токен с помощью Visual Studio. Доступ токен не может быть получен. Файл поставщика Visual Studio Token отсутствует найден в "D: \ Local \ LocalAppData.IdentityService \ AzureServiceAuth \ tokenprovider.json" Параметры: Строка подключения: [Строка подключения не указана], Ресурс: https://database.windows.net/, Полномочия:. исключение Сообщение. Попытка получить токен с помощью Azure CLI. Токен доступа не может быть приобрела. «az» не распознается как внутренняя или внешняя команда, работоспособная программа или командный файл. Параметры: Строка подключения: [Нет указана строка подключения], ресурс: https://database.windows.net/, Полномочия: https://login.microsoftonline.com/common. Исключение Сообщение: попытался получить токен с помощью Active Directory Integrated Аутентификация. Не удалось получить токен доступа. get_user_name_failed: не удалось получить имя пользователя. Внутреннее исключение: формат указанного доменного имени недействителен Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.d__14.MoveNext ()

Это то, что я пытаюсь сделать возможным? Если да, то чего мне не хватает? Любые мысли будут оценены.

Для справки: метод, возвращающий соединение SQL:

private SqlConnection GetSqlConnection()
{
    var accessToken = new AzureServiceTokenProvider().GetAccessTokenAsync("https://database.windows.net/").Result;

    return new SqlConnection
    {
        ConnectionString = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString,
        AccessToken = accessToken
    };
}

... и это строка подключения:

  <connectionStrings>
    <add name="Default" connectionString="Data Source=myserver.database.windows.net;Initial Catalog=MyDB;" providerName="System.Data.SqlClient" />
  </connectionStrings>

Примечание. Локальная AD синхронизирована с аналогом Azure AD.

1 Ответ

0 голосов
/ 19 ноября 2018

После развертывания приложения укажите параметры приложения и строку подключения в опции веб-приложения Application Settings в Azure. См. Эту статью .

enter image description here

Примечание . Он извлек значение из параметров приложения, настроенных в блейде службы приложений Azure - Application Settings, но не из файла Web.config. Таким образом, вы можете изменить эти настраиваемые значения, когда захотите их изменить, не зависимо от разработчиков. То же правило применяется даже для Connection String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...