ASP.NET和SQL Server 2008中出现“用户'NT AUTHORITY\IUSR'的登录失败”的错误。

20

我的ASP.NET v3.5 Web应用程序在尝试连接到SQL Server 2008数据库时抛出以下异常:

System.Data.SqlClient.SqlException:请求的登录没有打开名为“MyDbName”的数据库。登录失败。用户“NT AUTHORITY\IUSR”登录失败。

问题是,我已将 NT AUTHORITY\IUSR 添加到服务器的登录列表和数据库的用户列表中。对于服务器,我授予了用户公共角色,在数据库中我授予了 db_datareader 权限。

我还为应用程序池运行的标识 NT AUTHORITY\NETWORK SERVICE 授予了相同的权限。

Web应用程序由IIS7托管,如果有区别的话。当DB和IIS在同一台物理机上时,问题仍然存在。

9个回答

10
这里的诀窍在于,NT AUTHORITY\NETWORK SERVICE 实际上会出现为 DOMAINNAME\MACHINENAME$(请注意 $ 符号!)。也就是说,当你从 Web 服务器跨越机器边界到 SQL Server 时,如果使用 NETWORK SERVICELOCAL SYSTEM 帐户,则 SQL Server 将看到机器帐户。如果使用任何其他非域帐户,则 SQL Server 不会接收到您的凭据。
我有点困惑你的错误消息。老实说,我认为当 DB 在另一台机器上时,你不会看到任何东西,只会得到 Login Failed for NT AUTHORITY\ANONYMOUS LOGONIUSR 用于匿名网站,不能通过网络传递到 SQL Server。如果你在同一台机器上执行所有操作,可能会找到使其工作的方法,但我永远不会这样做... ;-)


1
我只是在测试是否可以在同一台机器上运行 - 在生产环境中,拓扑结构最好描述为分散的。无论如何,你做得很好 - 我必须为machineName $添加权限。谢谢! - Justin R.
1
只是想补充一下,我通过为IIS 6.0 Web Sites->Properties->Directory Security->Edit (Authentication…)中找到的IUSER用户名创建权限来解决这个问题,该用户名是IUSR_MACHINENAME。 - shawad
你是如何在VS中为MachineName$添加权限的? - Ragnar

5

如果有帮助的话,在 web.config 文件中,我添加了 <identity impersonate="false" /> 来解决这个错误(在 <system.web> 下)。


4
重要的是要注意,如果您没有配置IIS允许模拟登录,但您的web.config尝试进行模拟登录,则会出现此错误,就像我刚才遇到的一样。
我刚刚遇到了这个确切的错误,需要执行以下所有步骤:
  1. Ensure ASP.NET impersonation is enabled on your IIS web server:enter image description here

  2. Combine that with configuring your site to use impersonation (web.config):

    <system.web>
        <identity impersonate="true" userName="your_service_acct" password="***" />
    </system.web>
    
  3. The above steps presume that you have a SQL Login setup on your MSSQL for 'your_service_acct' with permissions

当在本地主机上运行,针对本地数据库,甚至是您个人具有权限的远程数据库时,开发IIS会像您一样运行,一切都可以神奇地工作。因此,在调试模式下,您不需要创建特殊的web.config。
一旦您将站点部署到某种服务器上(在我的情况下是我们的测试环境),您可能需要执行上述我刚刚详细介绍的步骤,因为IIS将尝试连接应用程序池用户,这通常不是您想要的管理方式。因此,这就是您想要开始使用web.config transformations的时候,这样Visual Studio就会在“发布...”部署步骤期间插入适当的identity impersonate="true"

2

我建议创建一个单独的(最好是域)帐户,并在连接字符串中指定它(通常在web.config文件中)。 然后,您可以限制Web服务器上此帐户可以执行和无法执行的权限。 然后,在SQL服务器中授予此帐户所需的权限。


0

不要在连接字符串中使用Integrated Security=True;,而是使用用户名和密码认证user=sa; pwd=mypassword;


不行!当有不同的用例,比如使用机器账户进行授权时,你不能建议使用用户名和密码。 - Steve Rakebrandt

0

我曾经遇到过同样的问题,通过更改应用程序池解决了这个问题。


-1

当您在最后一个数据库上恢复新数据库时,会出现此问题。

要解决此问题,您必须进入SQL Server,然后进入安全性,再次设置您的应用程序池。


-1
这对我有用: 打开IIS管理器(inetmgr) 在“连接”面板中,向下钻取到您的站点节点并选择它 在右侧面板中,在“IIS”组下,双击“身份验证”图标。 右键单击“匿名身份验证”,然后从上下文菜单中选择“编辑...”。 在弹出对话框中,选择“应用程序池身份”单选按钮。 点击确定。

-1

简单的解决方案是检查您的 web.config 文件,并确保以下之一是数据库连接字符串的一部分:

Trusted Connection=false

或者

Integrated Security=True


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