给予Asp.net mvc应用程序在SQL Server数据库中创建和删除权限。

3
我正在使用SQL Server 2008 R2遇到了问题。我开发的应用程序需要在不同地区的客户端站点进行测试。因此,我计划仅在客户端机器上进行配置一次,然后针对与应用程序相关的任何更改,我将只分发一个asp.net mvc部署包,客户端可以在IIS上进行部署。为此,我需要提供我的asp.net应用程序能够通过codefirst entity framework删除和创建数据库的能力。在当前配置中,我遇到了与删除数据库相关的权限问题。应用程序无法删除数据库。以下是我使用的IIS和SQL Server配置摘要。
对于IIS,我已按照标准做法将应用程序池身份设置为“Local Service”。asp.net web.config文件中的连接字符串如下。
connectionString="Server=.\SQLEXPRESS;Database=SomeDatabase;Trusted_Connection=true;User Id=someuser;Password=somepassword" />

对于 SQL Server 服务,我已经设置“本地服务”为登录用户,以提供服务的最小访问权限。对于 SQL Server 实例登录,我已定义了用户和密码并赋予完整的“sysadmin”角色权限。
有了这个配置,我期望我的 IIS 应用程序可以使用上述创建的用户和密码连接,并具有删除和创建 SQL Server 数据库的能力。但是,我尝试删除数据库时却得到了“权限被拒绝”的错误提示。异常信息如下所示。
System.Data.SqlClient.SqlException (0x80131904): Cannot drop the database 'SomeDatabase', because it does not exist or you do not have permission.

我已检查过数据库是否存在,因此问题只可能出在权限上。我是否遗漏了某些配置?


如果您通过命令行工具作为其中一个用户连接到数据库,而不是通过应用程序连接,那么您能否删除数据库? - billinkc
3个回答

2

明确一点,你的连接字符串存在一些格式问题,可能不会按照你的期望进行操作。

当你在连接字符串中指定Integrated Security=true时,将会发生Windows身份验证。连接字符串中任何user id=属性都将被忽略。

通过删除Integrated Security=true属性来切换到SQL Server身份验证模式。

   Server=.\SQLEXPRESS;Database=SomeDatabase;
   User Id=someuser;Password=somepassword;

此外,只有数据库所有者、db_owner角色的成员或服务器管理员角色的用户才能执行DROP DATABASE命令。

将数据库用户someuser添加到db_owner角色中。

 EXEC sp_addrolemember 'db_owner', 'SomeUser';

如果您确定上述账户不应该拥有此角色(例如限制性安全环境、政策等),可以考虑创建并使用另一个账户来执行此操作。这可能意味着需要维护另一个连接字符串。如果用户/角色的分离对您很重要,那么第二个选项可能会起作用。


我认为当我向用户授予sysadmin(实例级别)角色时,它会向下渗透到数据库,并授予用户db_owner(以及在数据库和模式级别的所有其他角色)。所以我认为没有必要允许应用程序使用db_owner角色。此外,如果数据库被删除(由我的应用程序),则db_owner角色也将被删除,因此它没有任何作用。再次声明,我只是一个初学者,对我所评论的内容不太确定。 - Jatin
@Nathan,我知道,但我想不到其他的选择。就像我之前说的那样,如果我在数据库级别上授予access db_owner权限,它会很好地工作,直到数据库被删除为止。当我的数据库被删除后,应用程序如何能够重新创建数据库,因为原始数据库已经不存在了,应用程序可用的db_owner权限也已经消失了。 - Jatin

2

我认为在 Sql 连接中使用的真实账户是“本地服务(Local Service)”,因为你在连接字符串中定义了 Trusted_Connection=True。尝试将其移除并查看结果。如果我没错的话,这个参数将使用 Windows 集成账户,在你的情况下是本地服务(Local Service)。


0

在连接字符串中指定凭据时,您需要省略Trusted_Connection部分或将其设置为False

Data Source =myServerAddress; Initial Catalog =myDataBase; User Id =myUsername; Password =myPassword;

或者

Server =myServerAddress; Database =myDataBase; User ID =myUsername; Password =myPassword; Trusted_Connection =False;

更多详细信息请参见http://connectionstrings.com/sql-server-2008


如果我将Trusted_Connection设置为false或省略它,我会得到一个不同的异常(System.Data.ProviderIncompatibleException:提供程序没有返回ProviderManifestToken字符串),并且登录失败。有任何想法为什么会出现这个异常? - Jatin
在这种情况下,您的连接字符串有点错误。您需要在连接字符串中添加1)上下文2)提供程序名称。请参阅此快速博客以获取详细信息 - http://mattfrear.com/2011/01/01/system-data-providerincompatibleexception-was-unhandled-by-user-code/ - Suhas
Suhas,@Campbell,将Trusted_Connection设置为false并将身份验证模式设置为SQL Server就行了。我不知道我怎么会错过了这个问题。谢谢。 - Jatin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接