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

Локальное веб-приложение (.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 Class = 14 LineNumber = 65536 Number = 18456 Procedure = Server = xxxxxxxxxxx.tr4.canadacentral1-a.worker.database.windows.net,11057 State = 1 Source = .Net SqlClient Data Provider ErrorCode = -2146232060 Message = Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

Если я отключу Managed Service Identity, я получаю вместо этого следующую ошибку:

InnerExceptions = System.Collections.ObjectModel.ReadOnlyCollection`1[System.Exception] Message = One or more errors occurred. Data = System.Collections.ListDictionaryInternal InnerException = Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://database.windows.net/, Authority: . Exception Message: Tried the following 4 methods to get an access token, but none of them worked. Parameters: Connection String: [No connection string specified], Resource: https://database.windows.net/, Authority: . Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup. Parameters: Connection String: [No connection string specified], Resource: https://database.windows.net/, Authority: . Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Visual Studio Token provider file not found at "D:\local\LocalAppData.IdentityService\AzureServiceAuth\tokenprovider.json" Parameters: Connection String: [No connection string specified], Resource: https://database.windows.net/, Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. 'az' is not recognized as an internal or external command, operable program or batch file. Parameters: Connection String: [No connection string specified], Resource: https://database.windows.net/, Authority: https://login.microsoftonline.com/common. Exception Message: Tried to get token using Active Directory Integrated Authentication. Access token could not be acquired. get_user_name_failed: Failed to get user nameInner Exception : The format of the specified domain name is invalidat 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.

Попробуйте выполнить действия, описанные в этой статье: colinsalmcorner.com/post/…

Alberto Morillo 15.11.2018 15:40

AAD уже включен для базы данных. У меня вопрос: после подключения к SQL и запуска «SELECT CURRENT_USER» я получу пользователя службы приложений или исходные учетные данные пользователя AD?

JCallico 15.11.2018 17:48

Есть какой-нибудь процесс сейчас? Если у вас все еще есть проблема, дайте мне знать.

Joey Cai 20.11.2018 08:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
2 420
3

Ответы 3

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

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

@ Joey-Cay, спасибо, что нашли время опубликовать ответ. Моя проблема не связана с тем, что мне не удалось прочитать строку подключения. Исключение генерируется классом AzureServiceTokenProvider (), когда не удается найти жизнеспособный метод для получения токена доступа для подключения к ресурсу database.windows.net.

JCallico 20.11.2018 14:16

Думаю, для решения вашей проблемы вам необходимо сделать следующее:

  • Предоставьте пользователю доступ в качестве внешнего поставщика в базе данных: (вы также можете найти в AAD в разделе Enterprise applications, если вы выберете All applications). Важно убедиться, что этот идентификатор службы приложения уже создан в данный момент.
    • Для веб-приложения это имя веб-приложения.
    • Если вы используете слоты развертывания, имя пользователя sql - {application-name}/slots/{slot-name}.
    • Если вы используете идентификацию, управляемую пользователем, вам также необходимо указать настройку приложения AzureServicesAuthConnectionString со следующим значением: RunAs=App;AppId = {ClientId of identity}
  • Измените строку подключения и веб-конфигурацию, чтобы использовать интерактивную аутентификацию.
    • Строка подключения может быть примерно такой: Server=tcp:{server}.database.windows.net,1433;Initial Catalog = {DatabaseName};Persist Security Info=False;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Authentication='Active Directory Interactive'.
      • Это также работает с EntityFramework, но если вы настраиваете строку подключения непосредственно в Azure, вам нужно выбрать Custom вместо SqlAzure в качестве поставщика.
    • В web.config добавьте это
<SqlAuthenticationProviders>
   <providers>
      <add name = "Active Directory Interactive" type = "Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
   </providers>
</SqlAuthenticationProviders>

в службах приложений выберите свое приложение или слот развертывания, затем нажмите «Удостоверение», и вы перейдете на вкладку «Назначенная система», где сможете включить ее.

donatasj87 04.09.2019 08:41

Спасибо за это. "Если вы используете слоты развертывания, имя пользователя sql - {application-name} / slots / {slot-name}" нигде не нашел.

JNappi 08.11.2019 00:07

Убедитесь, что вы добавили пользователя идентификации в свой SQL Azure и предоставили необходимые права.

CREATE USER [MyAppIdentity] FROM EXTERNAL PROVIDER
GO
ALTER ROLE db_datareader ADD MEMBER [MyAppIdentity];
ALTER ROLE db_datawriter ADD MEMBER [MyAppIdentity];

Другие вопросы по теме