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

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

我知道有成千上万的报告称人们无法让集成 Windows 身份验证与 IIS 配合使用,但它们似乎都指向不适用的网页或我已经尝试过的解决方案。我之前部署过几十个这样的网站,所以要么是服务器/配置出了什么奇怪的问题,要么是我研究这个问题太久了,没有发现明显的问题。

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

在本地机器上:

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

在远程计算机上:

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

最后但同样重要的一点是,我尝试针对 401.2 错误打开 FREB,但结果似乎没有告诉我任何有用的信息,我看到的只是以下警告:

模块设置响应错误状态

ModuleName IIS Web Core
通知 2
HttpStatus 401
HttpReason 未授权
HttpSubStatus 2
ErrorCode 2147942405
ConfigExceptionInfo
通知 AUTHENTICATE_REQUEST
ErrorCode 访问被拒绝。(0x80070005)

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

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

有人能告诉我这里我可能遗漏了什么吗?


快速更新:

我有点不愿意发送整个 Wireshark 转储,因为它会泄露 IP、URL 和其他内容,但是我在 Fiddler 中对来自本地主机和远程服务器的 HTTP 响应进行了并排比较,问题似乎很明显:

本地主机:

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

偏僻的:

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

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

因此,我想问题可以缩小为:当 Windows 身份验证似乎已安装、加载并独占启用时,为什么 IIS 不发送 WWW-Authenticate 标头?

答案1

问题解决了。我最终决定比较模块并排列出,实际上有一个缺失。原来有Windows 身份验证模块:

模块列表

在服务器上,托管WindowsAuthentication模块在那里,但没有WindowsAuthenticationModule上面突出显示的本机模块。为什么这样配置是任何人都无法猜测的,但显然,如果本机模块未加载,托管模块将顺利加载并默默失败。

因此,对于将来遇到此问题的读者,请确保您已经两个模块均已加载,因为 IIS不会警告你如果其中一个缺失。

答案2

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

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

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

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

相关内容