SQL DB

时间:2018-04-25 15:32:39

标签: c# sql azure

我一直潜伏在互联网上,试图为我的问题寻找解决方案:

我在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网站上阅读有关此主题的内容,但似乎找不到解决方案。

编辑:

我读过这样的文章: 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#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

https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?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进入收容状态,我会回复你。

1 个答案:

答案 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

https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?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 /新创建的用户访问我的数据库。

干杯!