Я снова и снова скрываюсь в Интернете, пытаясь найти решение для моей проблемы:
У меня есть SQL DB на Azure SQL Server.
В дополнение к этому есть приложение, говорящее с этим сервером и БД в частности.
На данный момент я использую учетные данные моего основного пользователя.
Теперь я хотел бы создать «автономного» (моей цели) пользователя или просто пользователя с ограниченными правами («Обновить», «Выбрать», «Удалить», «Вставить») только для моей текущей базы данных SQL.
Я выполнил приведенные ниже строки кода, чтобы создать пользователя только с правами чтения / записи.
CREATE USER AppUser WITH PASSWORD='123abc';
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;
После того, как эти строки кода были выполнены нормально, я зашел в свое приложение, чтобы изменить строку подключения, но я не смог получить доступ к своей БД с этим вновь созданным пользователем.
Я уверен, что что-то упустил, но я не знаю, что это такое.
Последние несколько дней я провел на веб-сайте Microsoft Docs, читая эту тему, но, похоже, не нашел решения.
EDIT:
Я читал такие статьи:
https://docs.microsoft.com/en-us/sql/relational-databases/databases/contained-databases?view=sql-server-2017
https://docs.microsoft.com/en-us/sql/relational-databases/security/contained-database-users-making-your-database-portable?view=sql-server-2017
https://social.msdn.microsoft.com/Forums/en-US/7bea6830-5ce9-4f00-ab1e-355b1476494d/login-failed-contained-database-contained-user?forum=sql14tools
В приведенной выше статье было предложение, чтобы я "установил опцию уровня экземпляра", выполнив:
exec sp_configure 'contained database authentication', 1;
go;
reconfigure;
go;
Я не знаком с этими командами, и они не выполняются в SQL SM Studio. Я определенно делаю что-то не так здесь.
Вот сообщение об ошибке:
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'sp_configure'.
То же предложение было найдено по адресу:
https://www.sqlshack.com/contained-databases-in-sql-server/
Но снова я не смог выполнить предоставленный код.
Я знаю, что моя БД не содержится:
select containment,name from sys.databases where name='my_DB';
название содержания
0 my_DB
Опять, то же предложение было найдено на этом сайте:
https://www.sqlrx.com/contained-databases-pros-and-cons/
И снова я почему-то не смог выполнить код.
При попытке войти в SQL Studio с созданным пользователем, я получаю это сообщение об ошибке:
===================================
Не удается подключиться к my_DB.
===================================
Ошибка входа пользователя 'AppUser'. (Поставщик данных .Net SqlClient)
Для получения справки нажмите: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=18456&LinkId=20476
Имя сервера: my_DB
Номер ошибки: 18456
Серьезность: 14
Состояние: 1
Номер строки: 65536
вот строка подключения в моем приложении C #:
SqlConnection connection = new
SqlConnection("Server=tcp:my_DB_Server,1433; " +
" Database=my_DB;Persist Security Info=False; " +
" User ID=AppUser;Password=123abc; " +
" MultipleActiveResultSets=False;Encrypt=True; " +
" TrustServerCertificate=False;Connection Timeout=30;");
Что тоже не получается.
РЕДАКТИРОВАТЬ II:
Полагаю, мне нужно сначала выяснить, как сделать my_DB содержавшимся.
А затем попробуйте использовать Contained user для входа в него.
РЕДАКТИРОВАТЬ III:
Создан, содержащийся Используется в моей базе данных. Я вижу это на вкладках Безопасность / Пользователи.
Но его нет на вкладке Сервер / Безопасность / Логины.
Нужно ли предоставлять информацию о пользователях, содержащихся на сервере?
Документы выше говорят: нет, я не обязан. Документы говорят, что аутентификация происходит на уровне БД, а не на сервере (если я прав)
Спасибо!
РЕДАКТИРОВАТЬ III:
Итак, после еще одного поиска, я думаю, я понял это.
Я не уверен, смогу ли я отредактировать этот ответ позже
но здесь мы идем.
1-й - я должен был убедиться, что моя БД установлена в смешанный режим.
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')
вот несколько статей, которые были полезны в моем поиске:
https://stackoverflow.com/a/1601275/9698341
https://stackoverflow.com/a/1134357
0 - смешанный режим, 1 - режим аутентификации Windows
2-й - мне пришлось создать логин перед созданием пользователя.
CREATE LOGIN AppUserLogin WITH PASSWORD=N'1234abcd'; <-- On master database
(И я думаю, на данный момент я не уверен, относится ли это к ограниченным пользователям или нет, но это следует делать, если вы хотите создать пользователя с несколькими привилегиями, а не с полным доступом к БД или Серверу .)
Подключитесь к вашей БД, в данном случае это my_DB и строка запуска ниже.
USE my_DB;
Над строкой кода выбирает целевую базу данных для создания пользователя (если я прав)
3-й - Создание пользователя сверху Логин
CREATE USER AppUser FROM LOGIN AppUserLogin;
Возможно, над строкой кода создается пользователь, который не проходит аутентификацию на уровне базы данных.
Полезные ссылки: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-2017
https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-2017
4-й - Предоставить права чтения / записи для AppUser
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;
и еще один:
https://stackoverflow.com/a/3998649/9698341
В этот момент я смог войти в свой SQL Server и DB через SQL SMStudio, но не через строку подключения C #:
SqlConnection connection = new SqlConnection("Server=tcp:my_Server,1433; " +
" Database=my_DB;Persist Security Info=False; " +
" User ID=AppUserLogin;Password=1234abcd " +
" ultipleActiveResultSets=False;Encrypt=True; " + TrustServerCertificate=False;Connection Timeout=30;");
После работы с приложением C # я обнаружил, что некоторые поля зашифрованы.
Я мог бы делать это задом наперед, но я сравнивал пароль с полем пароля в одной таблице. И я обнаружил, что возвращаемый результат был замаскирован так: 'xxxx'
эта строка кода решает разоблачение:
GRANT UNMASK TO AppUser;
Это означает, что созданные логин и пользователь работают.
Другая ошибка, которую я обнаружил, заключается в этой строке кода:
User ID=AppUserLogin;Password=1234abcd
Вместо
AppUserLogin
У меня изначально было
AppUser
Теперь у меня есть доступ к моей БД с вновь созданным пользователем, который имеет ограниченные привилегии. База данных не содержит ни пользователя (пожалуйста, исправьте меня, если я ошибаюсь ", но пока подойдет.
Если я попаду my_DB в камеру содержания, я вернусь к вам.