6

我已经构建了一个 ASP.NET MVC 2 网站,我使用 IIS 7.0 在 Rackspace 云服务器上托管该网站。

当我尝试在服务器上使用 IIS 7.0 在 localhost 下测试网站时,我收到一个错误页面。这来自 SQL 日志(我使用的是 SQL Web 版):

Error: 18456, Severity: 14, State: 11
Login failed for user 'IIS APPPOOL\DefaultAppPool'. Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors. [CLIENT: <local machine>]

我的网站在我的家用 PC 上运行良好,因此问题与连接数据库有关。

研究了错误消息代码后,它表明我有一个有效的数据库登录,但服务器访问失败。我在各种论坛(包括stackoverflow / serverfault)上对此进行了大量阅读,这是我尝试过的,但都没有解决这个问题:

  1. 使用 SQL Server 身份验证设置新登录。我在 SQL 中创建了一个新登录名,并为我的数据库提供了正确的访问权限。我在网络配置中使用了以下连接字符串:

    数据源=myServer;初始目录=myDB;用户ID=myUsername;密码=myPassword;

  2. 将新登录名创建为IIS APPPOOL\DefaultAppPool. 我在 SQL 中创建了具有正确访问权限的新登录名并使用了 Windows 身份验证。连接字符串如下:

    服务器=myServer;数据库=myDataBase;Trusted_Connection=True;

  3. 使用现有网络登录NT AUTHORITY\NETWORK SERVICE。我使用正确的访问权限将此用户映射到我的数据库。连接字符串如下:

    服务器=myServer;数据库=myDataBase;Trusted_Connection=True;

当我在线阅读材料时,这些似乎是主要选项。最后,这里还有一些其他可能有用的东西:

  • 将 SQL 设置为以管理员身份运行并没有解决问题
  • 关闭UAC没有帮助
  • 我的应用程序池正在使用ApplicationPoolIdentity(出于安全原因最好)

简而言之,我的网站无法启动,因为它无法从数据库中获取对象,因此会引发错误。问题是对服务器的访问权限设置不正确。我无法确定我需要什么配置的 SQL 登录名/连接字符串/域访问权限。

这让我烦恼了 3 周——你能抽出 5 分钟来帮助我吗?

4

1 回答 1

8

由于您的服务器(Web 和 SQL)不是域的一部分,因此您不能使用 Windows 身份验证(集成安全性)连接到 SQL Server。

在 IIS 中,当具有Integrated Security=SSPI连接字符串时,用于连接 SQL Server 的实际用户是应用程序池标识。

您应该选择选项 1,即使用 SQL Server 身份验证设置新登录

因此,步骤将是:

  1. 创建您的myUsernameSQL Server 用户。
  2. 在用户的属性对话框中,转到该Securables部分并确保Public已选中。
  3. 接下来,移动到该User mapping部分(在左侧)。在列表中查找您的数据库并检查它。在下面的列表中,Database role membership确保选中public和。db_datareaderdb_datawriter
  4. 现在授予您的用户执行存储过程的权限。作为sa,在 Management Studio 中,执行:

    授予我的用户名执行;

  5. 你完成了。

至于安全性,您可以稍后将权限细化myUserName为不能,例如删除表或其他对象。

在您的应用程序中,您现在应该在第 1 点使用连接字符串。

如果您有任何其他问题,请发布错误消息。

于 2012-06-24T08:37:37.910 回答