22

我看到很多人都遇到了这个错误,但他们的情况似乎都和我的有点不同。

我有一个在 Windows 2003 服务器上的 IIS 6.0 中运行的 ASP.NET 4.0 Web 应用程序。

当我远程到 Web 服务器框并在那里登录并以localhost而不是机器名访问该站点时,Web 应用程序工作正常。但是,当我从另一台客户端计算机访问该网站时,我收到以下错误:

Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

该网站已启用匿名访问 Windows 身份验证。该网络应用程序包含以下内容:

    <authentication mode="Windows">    </authentication>
    <identity impersonate="true"/>

  <connectionStrings>
      <add name="MyConnection" connectionString="Data Source=MyDbServer;Initial Catalog=MyDatabase;Integrated Security=True"
</connectionStrings>

我的 Web 服务器在虚拟服务器上运行。这相关吗?我假设不是。

请注意,如果我在 Impersonation = TRUE 之后在 Web 配置中添加我的域\登录名和密码,则该站点可以正常工作。

4

3 回答 3

40

听起来您遇到了所谓的“双跳”问题,即不信任服务器将客户端的凭据传递到另一个框(跃点 1 是 IIS 框的凭据,跃点 2 是从 IIS 框到 SQL Server)。

当您直接登录到服务器时,不需要发生第二个跃点,因为它只是将凭据直接从客户端计算机(本场景中的 IIS 服务器)直接传递到 SQL Server。同样,如果 SQL Server 位于 IIS 框上,您也不会出现此错误,因为客户端只会向可以与 IIS 和 SQL Server 共享凭据的框发出一个请求。

要使委派工作需要执行相当多的步骤,例如信任服务器以进行委派、创建 SPN 并确保为 IIS 用于运行网站的帐户提供其他适当的权限。这里有一篇技术网文章可以帮助您完成许多必需的步骤: https ://docs.microsoft.com/en-us/archive/blogs/taraj/checklist-for-double-hop-issues-iis -and-sql-server

注意:如果您使用的是 NTLM 而不是 Kerberos(或其他可委托协议),它将无法工作,因为中间服务器(IIS 服务器)需要有一个可以传递的令牌。由于 NTLM 是基于协商的,因此它不会起作用。

2020 年更新:如果您开始再次看到此问题弹出,并且它仅影响 Windows 10 用户或 Windows 2016+ 用户,则可能是在您用户的计算机上实施了“Credential Guard”(请参阅​​:https:// /docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-requirements)。中断的事情之一是 Kerberos 无约束委派 - 因此,如果您遇到这种情况,您可能需要重新配置中间框(上例中的 IIS 服务器)以使用约束委派而不是无约束委派。

于 2012-06-15T17:28:58.967 回答
6

这里的问题是你正在使用

<authentication mode="Windows">    </authentication>

这需要您的浏览器发送NTLM凭据。Firefox 默认不发送。

当您在服务器上并使用 localhost 时,您的浏览器会将您的 Windows 登录凭据发送到服务器。它正在对用户 MyDomain\MyID 进行身份验证并授予访问权限。

ASP.NET 模拟 IIS 传递给它的令牌,该令牌可以是经过身份验证的用户,也可以是匿名 Internet 用户帐户 (IUSR_machinename)。

来自不在该域中的计算机的所有 Web 请求都将在匿名帐户下运行。在你的情况下,NT AUTHORITY\ANONYMOUS LOGON

您的连接字符串正在使用 , Integrated Security=True。这意味着 asp.net 线程正在处理的 Windows 帐户也必须有权访问数据库。如果要传递用于登录 IIS 的 Windows 凭据,则必须设置Trusted_Connection=Yes.

请参阅:如何:使用 Windows 集成安全性访问 SQL Server

我建议您查看表单身份验证,如果您打算在 Web 上公开此 Web 服务,或者如果您想让与您的服务器域不同的用户可以使用它。

于 2012-06-11T04:14:04.980 回答
2

我发现我的问题是在 IIS 中我启用了 Windows 身份验证而不是基本身份验证。切换到基本身份验证后,我就能够访问已登录帐户下的 SQL Server。

在 IIS 中,只有基本身份验证使用通过网络流向远程 SQL 服务器的安全令牌登录用户。默认情况下,与身份配置元素设置结合使用的其他 IIS 安全模式不会生成可以向远程 SQL Server 进行身份验证的令牌。

来自:http: //msdn.microsoft.com/en-us/library/bsz5788z.aspx

于 2012-09-17T00:38:34.980 回答