我一直潜伏在互联网上,试图为我的问题寻找解决方案:
我在Azure SQL Server上有一个SQL DB。 除此之外,还有一个应用程序与此服务器和DB进行通信。
目前我一直在使用我的主用户的凭据。 现在我想创建一个包含' (我的目标)用户或仅限具有有限权限的用户(更新,选择,删除,插入)仅适用于我当前的SQL DB。
我在下面的代码行中执行以创建仅具有读/写权限的用户。
CREATE USER AppUser WITH PASSWORD='123abc';
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;
在执行了这些代码行之后,我转到我的应用程序来更改连接字符串,但是我无法使用这个新创建的用户访问我的数据库。
我确定我错过了一些东西,但我不知道它是什么。
我花了几天时间在Microsoft Docs网站上阅读有关此主题的内容,但似乎找不到解决方案。
在上面的文章中,有人建议我应该设置实例级别选项"通过运行:
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数据提供程序)
服务器名称:my_DB 错误号码:18456 严重程度:14 州:1 行号:65536
这是我的C#app中的连接字符串:
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用户登录。
编辑III:
已创建包含已在我的数据库中使用。我可以在Security / Users选项卡下看到它。
但它不在“服务器/安全/登录”选项卡下。
我是否需要提供服务器包含的用户信息? 上面的文件说:不,我不必。文档说,身份验证发生在数据库级别而不是服务器(如果我是正确的)
谢谢!
编辑III:
所以,经过一番搜索,我想我已经弄明白了。 我不确定我以后能否编辑这个答案 但是我们走了。
1st - 我必须验证我的数据库是否设置为混合模式。
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')
这里有一些对我的搜索很有帮助的文章: https://stackoverflow.com/a/1601275/9698341 https://stackoverflow.com/a/1134357
0 - 混合模式,1 - Windows身份验证模式
第二 - 我必须在创建用户之前创建一个Login。
CREATE LOGIN AppUserLogin WITH PASSWORD=N'1234abcd'; <-- On master database
(我想在这一点上我不确定这是否适用于包含用户,但是如果你想创建一个权限很少但不能完全访问数据库的用户,或者它应该这样做。服务器。)
连接到您的数据库,在这种情况下,它是my_DB并在下面运行。
USE my_DB;
上面的代码行选择用于创建用户的目标数据库(如果我正确的话)
3rd - 从上面创建用户登录
CREATE USER AppUser FROM LOGIN AppUserLogin;
上面的代码行可能正在创建未在数据库级别进行身份验证的用户。
有用的链接:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-2017
4th - 授予AppUser的读/写权限
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;
另一个: https://stackoverflow.com/a/3998649/9698341
此时我可以通过SQL SMStudio登录我的SQL Server和DB,但不能通过我的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#应用程序后,我发现某些字段已加密。 我可能会向后做,但我在一个表中将A密码与密码字段进行比较。我发现返回的结果被掩盖了:&#39; xxxx&#39;
这行代码解决了取消屏蔽:
GRANT UNMASK TO AppUser;
这表示创建的登录名和用户正在运行。
我发现的另一个错误就是这行代码:
User ID=AppUserLogin;Password=1234abcd
而不是
AppUserLogin
我最初有
AppUser
现在,我可以使用具有有限权限的新创建用户访问我的数据库。数据库不包含,也不包含用户(如果我错了,请纠正我,#34;但现在就可以了。
如果我确实让my_DB进入收容状态,我会回复你。
答案 0 :(得分:0)
1st - 我必须验证我的数据库是否设置为混合模式。
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')
这里有一些对我的搜索有帮助的文章:https://stackoverflow.com/a/1601275/9698341 https://stackoverflow.com/a/1134357
0 - 混合模式,1 - Windows身份验证模式
第二 - 我必须在创建用户之前创建一个Login。
CREATE LOGIN AppUserLogin WITH PASSWORD=N'1234abcd'; <-- On master database
(我想在这一点上我不确定这是否适用于包含用户,但是如果你想创建一个权限很少但不能完全访问数据库的用户,或者它应该这样做。服务器。)
连接到您的数据库,在这种情况下,它是my_DB并在下面运行。
USE my_DB;
上面的代码行选择用于创建用户的目标数据库(如果我正确的话)
3rd - 从上面创建用户登录
CREATE USER AppUser FROM LOGIN AppUserLogin;
上面的代码行可能正在创建未在数据库级别进行身份验证的用户。
有用的链接:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-2017
4th - 授予AppUser的读/写权限
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;
和另一个:https://stackoverflow.com/a/3998649/9698341
此时我可以通过SQL SMStudio登录我的SQL Server和DB,但不能通过我的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#应用程序后,我发现某些字段已加密。我可能会向后做,但我在一个表中将A密码与密码字段进行比较。我发现返回的结果被掩盖了:&#39; xxxx&#39;
这行代码解决了取消屏蔽:
向AppUser授予UNMASK; 这意味着创建的登录和用户正在运行。
我发现的另一个错误就是这行代码:
User ID=AppUserLogin;Password=1234abcd
而不是
AppUserLogin
我最初有
AppUser
所以,我们走了。创建有限权限用户并且它正在运行。 另外,我可以通过C#w /新创建的用户访问我的数据库。
干杯!