我有一个在 IIS 上运行并使用 Windows 身份验证的网站。配置为可以访问该网站的所有用户都来自 AD 域(不是本地用户)。在网站的属性中,我已设置为使用 AD 域作为领域。
现在,使用 Firefox、Safari 或 Chrome 时,一切都很好。当用户尝试打开网站时,他会看到登录框。他只需输入“用户名”和“密码”(我们假设这是一个实际的登录名和密码 :P),即可进入网站。
但是,使用 IE 时,事情就变得糟糕了。当用户尝试打开网站时,他会看到登录框。用户再次输入“用户名”和“密码”,但这些输入被拒绝!当第二次登录框弹出时,用户名填写为“web-server-domain-name\username”,这是错误的,因为 web-server-domain-name 不是所有用户所在的域(它是“ad-domain”)。我花了好几天试图弄清楚发生了什么……请注意,如果我手动输入“ad-domain\username”,我会毫无问题地被接受进入网站。所以,我猜想如果没有指定域,IE 会发送错误的用户名。
无论如何,IE 是唯一会触发此行为的浏览器!
是否可以进行服务器端修复?也许可以以某种方式将用户自动映射到 AD 用户?
如果服务器端无法解决这个问题,那么客户端是否有解决办法?
谢谢。
附言:我更像是一名程序员,而不是系统管理员,因此配置服务器不是我的强项……:P
更新:
@Evan:是的,“Windows 域服务器的摘要式身份验证”也已启用。
@Eric:IIS 版本是 6.0。启用的身份验证方法是:集成和摘要 - 所有其他方法均被禁用。至于安全日志。我查看了它,在 Chrome/Firefox 中执行“用户名”和“密码”登录时以及在 IE 中执行“ad-domain\username”和“密码”登录时 - 生成的日志消息是相同的(无论如何,我没有看到任何区别)。当输入“用户名”和“密码”时,我没有在安全(或任何其他)日志中看到任何错误,因此无法判断它试图使用什么方法。
更新2:
正如 Eric 在评论中所建议的 - 我玩了一下 Fiddler...在玩的过程中,我注意到,当在 FF 和 IE 中输入“用户名”和“密码”时 - IE 发送的“授权”标头值(加密)比 FF 发送的要长(几乎两倍)。
我尝试禁用 Windows 集成身份验证并仅启用 Digest - 这样就解决了问题(意味着 IE 像其他浏览器一样使用了正确的领域),但这导致我的网站出现无数其他问题,因为使用 Digest - 服务器上的用户模拟不起作用(这会导致问题,当连接到数据库等时)。
有任何想法吗?
答案1
如果 Windows 服务器(运行 IIS 6.0)和 Windows 客户端(使用 IE 访问您的网站)都是本地网络 (LAN) 的一部分,则可能会发生这种情况。
同样相关的是,您已启用“集成 Windows 身份验证”,因为您需要使用和验证来自 AD 域的用户。
我们把这个AD域的名字称为ad_domain_name
。
在这种场景(LAN + 集成身份验证)中,Windows 客户端和服务器之间的身份验证过程在设计上使用 AD 域安全性。
您可以尝试以下方法检查是否存在这种情况(在 Windows 客户端上):
- 关闭所有 IE 窗口
- 打开 IE
- 访问您的网站并获取登录框
- 在“用户名”字段写入:
ad_domain_name\username
- 在“password”文件中写入该用户的密码
此过程应允许第一次尝试登录。
我多次观察到这种行为,通常微软的人认为这是本地网络的“所需安全功能”。而且通常不是什么问题,因为无论如何都可以完成登录过程。
我不知道是否存在 IIS(和/或 Windows 服务器)配置可以避免所有这些混乱,但我和您一样好奇。
答案2
我通常通过确保站点属于 IE 中的 Intranet 区域(这将执行无提示的身份验证)来解决此问题。