У меня возникли проблемы с подключением моей службы к базе данных с использованием встроенной аутентификации Active Directory.
У меня есть служба приложений, работающая в Linux, и экземпляр/база данных SQL Server, работающая в том же регионе. Служба приложений имеет назначенное системой управляемое удостоверение с ролью участника базы данных SQL для базы данных. У меня есть виртуальная сеть, настроен доступ к экземпляру SQL Server через виртуальную сеть, а служба приложений интегрирована с виртуальной сетью.
Экземпляр sql предоставляет пример строки подключения, например:
Server=tcp:foo.database.windows.net,1433;Initial Catalog=foo-db;Persist Security Info=False;User ID = {your_username};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication = "Active Directory Integrated";
Я не уверен, что мне следует использовать в качестве User ID
. Сначала я просто попытался опустить его, предполагая, что встроенная аутентификация сможет определить принципала службы, но оказалось, что это невозможно (возможно, это потому, что я работаю на виртуальной машине Linux, или, возможно, всегда нужно указывать пользователя ).
Я попытался еще раз использовать идентификатор объекта для назначенного системой управляемого удостоверения для службы приложений. Это тоже не сработало:
Не удалось аутентифицировать пользователя 190c6dd1-6b34-4181-b6b2-f9da12d7d8fc в Active Directory (Authentication=ActiveDirectoryIntegrated). Код ошибки 0xunknown_user_type Неподдерживаемый тип пользователя «Неизвестно»
Итак, как мне указать пользователя для удостоверения, назначенного системой для моей службы приложений, в строке подключения?
Я ожидаю, что здесь применимы рекомендации из Подключиться к Azure SQL с аутентификацией Microsoft Entra и SqlClient§Использование аутентификации управляемой идентификации, в частности, используя Authentication=Active Directory Managed Identity
и полностью отбросив имя пользователя:
Server=tcp:foo.database.windows.net,1433;Authentication=Active Directory Managed Identity;Initial Catalog=foo-db;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;
Ваша предпосылка относительно конфигурации авторизации также ошибочна, учитывая, что роль, которую вы назначили своему субъекту-службе (SQL DB Contributor
), не делает того, что, по вашему мнению, она делает; из документации Microsoft:
SQL DB Contributor Позволяет управлять базами данных SQL, но не получать к ним доступ. Кроме того, вы не можете управлять их политиками безопасности или родительскими SQL-серверами.
Вместо этого добавьте субъект-службу в RBAC в самой базе данных, выбрав целевую базу данных и затем выполнив следующий оператор от имени пользователя с разрешениями ALTER ANY USER
:
CREATE USER <Azure_AD_principal_name> FROM EXTERNAL PROVIDER;