解决 IIS 7.5 中的 Windows 身份验证问题(无挑战)?

Aar*_*ght 22 security iis authentication iis-7.5 http-authentication

我知道有数以千计的人在将集成 Windows 身份验证与 IIS 一起使用时遇到问题的报告,但它们似乎都导致网页不适用或我已经尝试过的解决方案。我之前已经部署了几十个这样的站点,所以要么服务器/配置发生了一些奇怪的事情,要么我已经研究了太久而没有看到明显的情况。

简而言之,一切都在我的本地机器上完美运行,但在生产服务器上却崩溃了,据我所知,它具有完全相同的配置

在本地机器上:

  • 该机器运行的是 Windows 7 Ultimate、Service Pack 1、IIS 7.5。
  • 该站点已成功测试,使用 IIS 和 VS Web 开发服务器。
  • IIS 站点配置禁用了Windows 身份验证之外的所有身份验证方法。
  • 本地机器不在任何域中。
  • 设置的提供程序是 Negotiate 和 NTLM(不是 Negotiate:Kerberos)。
  • 扩展保护关闭。
  • 所有经过测试的浏览器(IE、Firefox、Chrome)都会显示质询提示,并允许我使用我的(本地)Windows 帐户登录到localhost域。
  • 所有经过测试的浏览器也使用不透明的本地 IP 地址工作 - 因此浏览器本身似乎并不关心该站点是“本地”还是“远程”。
  • 我在网页上添加了一条显示行,显示当前登录的用户,它准确地显示了我的期望(无论我使用哪个本地用户登录)。

在远程机器上:

  • 服务器运行的是 Windows Server 2008 R2、IIS 7.5。
  • 加载网页会立即导致401.2 错误:由于身份验证标头无效,您无权查看此页面。 从来没有出现过挑战提示。
  • IIS 站点配置禁用了Windows 身份验证之外的所有身份验证方法。
  • 远程机器不在任何域中。
  • 设置的提供程序是 Negotiate 和 NTLM(不是 Negotiate:Kerberos)。
  • 扩展保护关闭。
  • 在远程计算机(远程桌面会话)上,无论域是localhost还是外部 IP 地址,Internet Explorer 中都会出现相同的错误。
  • 如果我尝试从本地计算机查看远程网站,错误仍然是 401,但 401 略有不同。没有子代码,文本为:访问被拒绝,因为凭据无效。
  • Windows身份验证IIS角色功能安装。
  • 所述WindowsAuthentication模块(在服务器级)加入。
  • 如果我关闭 Windows 身份验证并启用基本身份验证,则会发生完全相同的错误。
  • 如果我关闭 Windows 身份验证并启用匿名(显然),该站点加载。
  • 我已经按照 Microsoft 支持中的所有故障排除步骤进行操作:对 IIS 中的 HTTP 401 错误进行故障排除
  • 我已经尝试过另一个 Microsoft 支持页面上显示解决方法(据说强制 NTLM 作为唯一方法)。

最后但并非最不重要的是,我尝试为 401.2 错误打开 FREB,结果似乎没有告诉我任何有用的信息,我看到的只是以下警告:

MODULE_SET_RESPONSE_ERROR_STATUS

ModuleName IIS Web Core
Notification 2 HttpStatus
401
HttpReason Unauthorized
HttpSubStatus 2
ErrorCode 2147942405
ConfigExceptionInfo
Notification AUTHENTICATE_REQUEST
ErrorCode 访问被拒绝。(0x80070005)

...这似乎只是告诉我我已经知道的事情(它只是拒绝请求而不是协商凭据)。

跟踪确实表明 WindowsAuthentication 模块已正确加载,因为有NOTIFY_MODULE_START一行带有ModuleName= WindowsAuthentication(以及其他各种 ASP.NET 后续事件 - [un] 幸运的是,这里没有有趣的错误或警告)。

谁能告诉我我在这里可能会错过什么?


快速更新:

我有点不舒服发送整个 Wireshark 转储,因为它会显示 IP、URL 和其他内容,但我对来自 localhost 和 Fiddler 中的远程服务器的 HTTP 响应进行了并排比较,这似乎相当自我- 明显的问题是什么:

本地主机:

HTTP/1.1 401 未经授权
缓存控制:私有
内容类型:文本/html;字符集=utf-8
服务器:Microsoft-IIS/7.5
WWW-Authenticate:协商
WWW-身份验证:NTLM
X-Powered-By: ASP.NET
日期:2011 年 12 月 17 日星期六 23:42:34 GMT
内容长度:6399
代理支持:基于会话的身份验证

偏僻的:

HTTP/1.1 401 未经授权
内容类型:文本/html
服务器:Microsoft-IIS/7.5
X-Powered-By: ASP.NET
日期:2011 年 12 月 17 日星期六 23:43:13 GMT
内容长度:1293

除了一些看似无关紧要的差异(如缓存控制)之外,主要区别在于远程服务器不会将 WWW-Authenticate 标头发送回客户端。

所以,我想这可以将问题缩小到:当 Windows 身份验证似乎已安装、加载和专门启用时,为什么 IIS 不发送 WWW-Authenticate 标头?

Aar*_*ght 15

问题解决了。我最终决定并排比较模块列表,实际上缺少一个。事实证明,有两个Windows 身份验证模块:

模块列表

在服务器上,托管WindowsAuthentication模块在那里,但不是WindowsAuthenticationModule上面突出显示的本机模块。为什么以这种方式配置是任何人的猜测,但显然如果未加载本机模块,托管模块将愉快地加载并默默地失败。

因此,对于未来遇到此问题的任何读者,请确保您已加载这两个模块,因为如果其中一个模块丢失,IIS将不会向您发出警告


小智 5

我们发现对于在 Windows 身份验证下运行的 ASP.NET 站点上本地工作的开发人员来说,这不一定解决问题。我们发现了一个禁用环回检查的注册表黑客;这修复了它: -

注册表项 - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

创建一个值为 1 的 DWORD,名为“DisableLoopbackCheck”

您必须重新启动机器才能使设置生效