我知道有成千上万的报告表明人们无法使集成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标头?