【问题标题】:Give Asp.net mvc app permission to drop and create SQL Server Database授予 Asp.net mvc app 删除和创建 SQL Server 数据库的权限
【发布时间】:2011-11-20 17:01:06
【问题描述】:

我正在使用 SQL Server 2008 R2,但遇到了问题。我开发的应用程序需要在不同地点的客户站点进行测试。所以我计划一次配置客户端的机器,然后对于与应用程序相关的任何更改,我将分发一个 asp.net mvc 部署包,客户端可以在 IIS 上部署它。为此,我需要为我的 asp.net 应用程序提供删除和创建数据库的能力(通过 codefirst 实体框架)。 在当前配置中,我面临与删除数据库相关的权限问题。应用程序无法删除数据库。这是我正在使用的 IIS 和 SQL Server 配置的摘要。

对于 IIS,我已按照标准做法将应用程序池标识设置为“本地服务”。 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.

我已检查数据库是否存在,因此归结为权限。我是否遗漏了一些配置?

【问题讨论】:

  • 如果您连接到数据库,不是通过您的应用程序,而是作为用户之一通过命令行工具,您可以删除数据库吗?

标签: asp.net sql-server asp.net-mvc sql-server-2008 iis


【解决方案1】:

需要明确的是,您的连接字符串格式有点不正确,可能与您预期的不一样。

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

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

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

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

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

 EXEC sp_addrolemember 'db_owner', 'SomeUser';

或者,如果您确定上述帐户不应担任此角色(即限制性安全环境、政策等),请考虑为此目的创建和使用另一个帐户。这可能意味着维护另一个连接字符串。如果用户/角色的分离对您来说足够重要,那么第二个选项可能会起作用。

【讨论】:

  • 我认为当我将 sysadmin(实例级别)角色赋予用户时,它会渗透到数据库和 db_owner(以及数据库和架构级别的所有其他角色) ) 被授予用户。所以我认为允许应用程序的 db_owner 角色毫无意义。此外,如果数据库被删除(由我的应用程序),那么 db_owner 角色也会被删除,所以它没有任何用处。同样,我只是一个初学者,所以不太确定我评论了什么。
  • @nathan,我知道,但我想不出其他选择。正如我之前所说,如果我在数据库级别授予 db_owner 访问权限,它会很好地工作,直到数据库被删除。在我的数据库被删除后,应用程序如何能够重新创建数据库,因为原始数据库以及应用程序可用的 db_owner 权限已经消失。
【解决方案2】:

我认为 Sql 连接上使用的真实帐户是“本地服务”,因为您在连接字符串中定义了 Trusted_Connection=True。尝试删除它,看看会发生什么。如果我没记错的话,此参数将使用 Windows 综合帐户,在您的情况下为本地服务。

【讨论】:

    【解决方案3】:

    在连接字符串中指定凭据时,您需要省略 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: The provider did not return a ProviderManifestToken string.),并且登录失败。有什么想法为什么会出现这个异常?
    • 在这种情况下,您的连接字符串有点错误。您需要在连接字符串中添加 1) 上下文 2) 提供者名称。有关详细信息,请参阅此快速博客 - mattfrear.com/2011/01/01/…
    • Suhas,@Campbell,将 Trusted_Connection 设置为 false 并将身份验证模式设置为 SQL Server 成功了。我想知道我是怎么错过的。谢谢。
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2015-04-24
    • 2022-11-14
    相关资源
    最近更新 更多