SQL Azure ошибка подключения с назначенной пользователем управляемой идентификацией «Ошибка входа для пользователя» - PullRequest
0 голосов
/ 06 мая 2020

У меня есть приложение-функция, которому назначен управляемый идентификатор , назначенный пользователем , и он использует его для подключения к базе данных SQL. Это работало нормально в течение нескольких дней, но затем внезапно перестало работать без каких-либо изменений в db или приложении-функции.

Error: Login failed for user '<ClientId>@<TenantId>'.
  • ClientId : ClientId назначенного пользователя управляемое удостоверение.
  • Идентификатор клиента : арендатор, в котором существует это удостоверение.

Я поискал в Интернете и нашел способов посмотреть более подробная ошибка в sys.event_log . В соответствии с этим я вижу, что это ошибка 18456, а состояние - 68. К сожалению, состояние 68 для ошибки 18456 нигде не задокументировано. ( Официальный do c).

Вот как я создаю SqlConnection (и обратите внимание, что это работало раньше, и тот же код работает в другом месте в той же точной настройке ):

SqlConnection connection = new SqlConnection("Server=tcp:myserver.database.windows.net,1433;Database=MyDb;");
connection.AccessToken = await new AzureServiceTokenProvider("RunAs=App;AppId=<ClientId>").GetAccessTokenAsync("https://database.windows.net/");

Пользователь был создан в базе данных с использованием:

CREATE USER [<Name of user assigned identity>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<Name of user assigned identity>];
ALTER ROLE db_datawriter ADD MEMBER [<Name of user assigned identity>];

Любые указатели на то, где я могу заглянуть дальше?

Примечание:

  1. Использование Azure Время выполнения функции 2.0 (do tnet core)
  2. Использование Microsoft. Azure .Services.AppAuthentication 1.4.0 (последняя стабильная версия).

Ответы [ 3 ]

1 голос
/ 15 мая 2020

Мне не удалось найти причину root, но я публикую то, что помогло мне разблокировать, так что, надеюсь, это поможет другим в будущем.

По какой-то причине все формы аутентификации (кроме Админ сервера AAD) на этом сервере не работал. Таким образом, не только сбой аутентификации пользователя, назначенного идентификатором (который описан в вопросе выше), но и содержал пользователь auth не удалось. Удаление назначенного пользователю идентификатора из базы данных и повторное добавление не сработало:

DROP USER [<Name of user assigned identity>];
CREATE USER [<Name of user assigned identity>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<Name of user assigned identity>];
ALTER ROLE db_datawriter ADD MEMBER [<Name of user assigned identity>];

Аналогичным образом удаление содержащегося пользователя и воссоздание тоже не сработали.

DROP USER [ContainedUser];
CREATE USER [ContainedUser] WITH PASSWORD='******';
ALTER ROLE db_owner ADD MEMBER [ContainedUser];

Я также заметил что вторичный (то есть реплика) работает нормально и auth работает против него. В общем, я пришел к выводу, что что-то не так с моим основным, но не уверен, что именно.

Итак, я решил воссоздать базу данных:

  • Я переключился на резервный.
  • Удалите ссылку репликации, а затем удалите плохой сервер. (просто удалить базу данных и выполнить остальные шаги, приведенные ниже, было недостаточно, я все же попробовал)
  • Восстановил сервер.
  • Перенастроена репликация, чтобы база данных была создана на новом сервере как вторичный.
  • Произведено еще одно аварийное переключение, чтобы вновь созданная база данных стала первичной.
  • Вся аутентификация работала нормально.
0 голосов
/ 07 мая 2020

Была ли служба, к которой привязано управляемое удостоверение, была удалена и создана заново? Если это так, отпечаток в Azure AD изменился, что и распознается SQL Сервером. К сожалению, это, вероятно, один из немногих недостатков Managed Identities с базами данных SQL и, насколько мне известно, это единственная услуга, которая требует этого. Попробуйте удалить и воссоздать пользователя и посмотрите, работает ли это.

В дальнейшем при развертывании CI / CD было бы полезно иметь простой сценарий SQL для удаления и повторного создания пользователя в БД каждый раз, когда подключенная к нему служба повторно развертывается.

Например:

BEGIN
DROP USER [MSI NAME]
    CREATE USER [MSI NAME] FROM  EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [MSI NAME];
    ALTER ROLE db_datawriter ADD MEMBER [MSI NAME];
END
GO
0 голосов
/ 07 мая 2020

Чтобы использовать идентификацию, назначенную пользователем, вам нужно будет предоставить дополнительную конфигурацию. См. поддержку строки подключения для библиотеки AppAuthentication.

enter image description here

При создании пользователя SQL обязательно используйте имя назначенного пользователем идентификатора ресурса, а не имя сайта.

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