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


21

我知道有成千上万的报告表明人们无法使集成Windows身份验证与IIS一起使用,但是它们似乎都导致无法应用的网页或我已经尝试过的解决方案。之前我已经部署了数十个这样的站点,因此服务器/配置发生了一些奇怪的事情,或者我已经看了太久而没有发现明显的问题。

简而言之,一切都可以在我的本地计算机上完美地运行,但是在生产服务器上却分崩离析,据我所知,它具有完全相同的配置

在本地计算机上:

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

在远程计算机上:

  • 该服务器正在运行Windows Server 2008 R2,IIS 7.5。
  • 加载网页会导致立即出现 401.2错误:由于身份验证标头无效,因此您无权查看此页面。 从未出现挑战提示。
  • IIS站点配置禁用了 Windows身份验证以外的所有身份验证方法。
  • 远程计算机不在任何域上。
  • 提供程序设置为“协商”和“ NTLM”(不是“协商: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核心
通知2 HttpStatus
401
HttpReason未经授权的
HttpSubStatus 2错误代码
2147942405
ConfigExceptionInfo
通知AUTHENTICATE_REQUEST错误代码
访问被拒绝。(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日星期六,格林尼治标准时间
内容长度:6399
代理支持:基于会话的身份验证

远程:

HTTP / 1.1 401未经授权
内容类型:text / html
伺服器:Microsoft-IIS / 7.5
X-Powered-by:ASP.NET
日期:2011年12月17日星期六,格林尼治标准时间
内容长度:1293

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

因此,我想这将问题范围缩小了:为什么在Windows身份验证似乎已安装,加载和独占启用的情况下,IIS为什么不发送WWW-Authenticate标头?


介意捕获身份验证尝试的纯文本消息(首先将您的密码更改为可丢弃的东西-我们不希望您的真实密码散列在网络上)?大约18个月之前,一个Windows补丁对HTTP NTLM协商进行了一些更改(顺便说一句,系统是否已全部打补丁?),这炸毁了供应商的应用程序,并为我提供了比我更愿意承认的分析经验谈判对话。
Shane Madden

@ShaneMadden:我会考虑要公开的所有各种信息,但是我可以进行一个Fiddler会话,该会话应该几乎是相同的,然后至少可以对IP进行匿名处理,等等。实际上,我已经这样做了,结果应该是不言自明的(客户端未显示凭据提示,因为服务器不需要任何提示)。
亚伦诺特2011年

哦,有趣的是,似乎有人也在Stack Overflow上报告了此问题 -遗憾的是,那里没有答案。
亚伦诺特2011年

@Aaronaught在这里,您如何获得与Cooking上不同的用户名?当我第一次看到这个问题时,我以为是有人在欺骗您。
沃德-恢复莫妮卡

@Ward:任何人都可以编辑其用户名,它是配置文件的一部分。这是我的原始版本,只能在非技术站点上使用其他版本。
亚伦诺特2011年

Answers:


14

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

模块清单

在服务器上,托管WindowsAuthentication模块在那里,但WindowsAuthenticationModule上面没有突出显示本机模块。为何以这种方式进行配置,这是每个人的猜测,但是显然,如果未加载本机模块,则受管模块将很乐意加载而静默失败。

因此,对于以后遇到此问题的所有读者,请确保同时加载了两个模块,因为如果其中一个模块丢失,IIS 不会警告您


托管的WindowsAuthentication模块听起来并非如此。它支持ASP.Net中的Windows身份,并且始终安装(安装ASP.Net时)。但是,在服务器管理器中勾选Windows Auth组件时,将安装Windows身份验证本机模块,这是使该身份验证选项在身份验证GUI中可见所需的内容。
TristanK 2011年

@TristanK:在这种情况下,该组件已被选中,但未安装该模块。(但是,该选项在Authentication GUI中可见-因此,我很确定屏幕取决于托管模块,而不是本地模块。)
Aaronaught 2011年

我认为这可能是由于对配置文件(可能是ApplicationHost.config)的一些篡改而导致的。但是我想这一切都没关系,这并不重要。它做了。
亚伦诺特2011年

好吧,很明显。除非碰巧破坏了Windows Auth,否则Windows Auth不会起作用。在这种情况下,尽管问题指出配置是相同的,但事实证明这是不正确的;所以效果不一样 QED。
2011年

1
Windows Server 2012 R2中缺少此模块的问题只是困扰我。令人难以置信的是,没有迹象表明这种情况会在何时发生。无论如何,非常感谢您的回答;我真的是在扯头发!
Rob Davis

4

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

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

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

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


我发现我可以在DisableLoopbackCheck为1和0之间切换,并且更改将立即生效。此外,您可以在事件日志安全日志中看到事件ID 4625,并显示消息“帐户无法登录”。
alastairtree

谢谢!用IIS身份验证和.Net版本花了2天的时间才发现它是因为我在测试站点迁移时使用我的主机文件创建了一个虚拟DNS条目。
JohnLBevan '17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.