Локальное веб-приложение (.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.