我成功配置了 ntlm 身份验证。不幸的是,配置允许半基本授权。例如,当我使用 tortoise svn1.8.4(带有 serf 访问库)、chrome 或 IE 网络浏览器时,它们会成功验证 NTLM 而不提示任何内容。在日志文件中,我看到了经过身份验证的用户。不幸的是,当我使用未配置的 FireFox 或 Maxthon 时,该浏览器会提示我输入凭据。我不需要这个,因为当我尝试从域外计算机访问时也会出现同样的情况。
我使用 Windows 服务器作为域控制器,使用 Windows7/8 作为系统客户端,使用 Linux/Debian 作为 Web 服务器。我配置了 Linux 中的 Kerberos 以用于 Windows AD,配置了 Winbind 以用于本地 NTLM 身份验证和 Apache 2.2 系列。对于 Apache 身份验证粘合,我使用 mod_auth_ntlm_winbind.so Apache2 模块,并在目录/位置下配置 ntlm 帮助程序以与 Winbind 通信。这可以正常工作,Apache 的示例:
<Directory /var/www/>
#defaults for main www directory
Options Indexes FollowSymLinks MultiViews
AllowOverride None
#modified, prevent for any ip access, for future add authless access from specified hosts
Order deny,allow
deny from all
#allow from IP/mask
#settings for NTLM auth with winbind helper
AuthName "NTLM Authentication"
NTLMAuth on
NTLMAuthHelper "/usr/bin/ntlm_auth --domain=MY.WINDOWS.DOMAIN --helper-protocol=squid-2.5-ntlmssp"
NTLMBasicAuthoritative on
AuthType NTLM
require valid-user
#because ip is default deny
satisfy any
</Directory>
我希望,也许我可以使用 apache authtype 变量进行一些重定向,然后我添加到上面的配置中重写:
RewriteEngine on
RewriteRule ^ /cgi-bin/TestAuth.pl?DollarOne=1&AUTH_TYPE=%{AUTH_TYPE}&REMOTE_USER=%{REMOTE_USER}
并将示例脚本TestAuth.pl作为cgi内容:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper; #easy way for print system variables
print "Content-type:text/plain\r\n"; #respectint HTML protocol
print "\r\n";
print "Enviroment contains:\r\n";
print "x\r\n";
print Data::Dumper->Dump([\@ARGV,\%ENV],[qw(ARGV ENV)]); #prints all script arguments and process variables
不幸的是,在所有情况下,使用基于 Windows 的 auth ntlm 和提示凭据时,我总是看到 AUTH_TYPE 始终是 NTLM。然后就无法识别浏览器做了什么。在这种情况下,我可以从域外的客户端进行访问。
我尝试用 strace 包装 ntlm 助手。不幸的是,我没有在其转储中看到任何重要信息,包括成功/失败身份验证和 IE 访问(无提示和 FF 提示)。我认为当 ntlm 助手向本地 samba 服务器进行身份验证时也会发生同样的情况,但我从未测试过这种情况。
现在我尝试使用多种身份验证类型(Basic 和 NTLM)进行一些配置。我尝试先使用 Basic,然后过滤掉总是失败的身份验证并将其重定向到信息页面。不幸的是,目前使用 NTLM 混合身份验证没有成功 :( NTLM 总是先完成。
那么有人知道如何防止凭据提示吗?如何撤销来自提示客户端的访问权限?如何识别凭据来自提示还是来自 Windows 客户端 API?
答案1
使用 NTLM 身份验证并不能保证无需凭证即可登录。如果您拥有服务器可以识别的有效 Windows 凭证,则不会收到密码提示。
如果用户没有有效的 NTLM 直通凭证,系统会提示他们提供。无法恢复到“基本”身份验证。
不幸的是,没有办法判断用户是否提供了凭证或者是否由系统传递。
也许可以问一个新问题,概述您希望用户体验到什么(即为内部和外部用户提供不同的站点),然后有人可能会以不同的方式提供帮助。
答案2
现在我通过将 NTLM 身份验证切换到 Kerberos 身份验证解决了这个问题。所有为 winbind 所做的准备都直接在 kerberos 下工作,因为我之前为 winbind 配置了 kerberos 以便与 AD 服务器通信。由于 kerberos 是开放的,开发人员预测用户端点上会有不同的子身份验证。apache2.2 kerberos 模块中的标志非常有用:
KrbMethodNegotiate on
KrbMethodK5Passwd off
这就是我想要的结果。浏览器获取带有属性“不弹出用户凭据”的 krb 框架,然后客户端就不会这样做。但如果是(有任何不兼容性?),Apache 服务器模块应该检测到这一点并撤销身份验证。
使用微软的 NTLM 是不可能的,因为协议被破坏了。Web 返回代码 201 之后的第一个 NTLM 框架无法添加属性“不提示用户输入凭据”。然后我可以在弹出窗口或 OS 会话密钥签名之后过滤该框架。这导致浏览器在 OS 会话密钥不可用时始终显示弹出窗口。
最终是另一个机会。用户需要一些时间来写入凭据,或者在凭据存储在浏览器中时接受。我可以计算将身份验证帧发送到浏览器和从客户端传入帧之间的时间。当时间太长时,我可以撤销。不幸的是,这可能会在繁忙的计算机或网络上造成错误的身份验证。
以后我会尝试这两种方法 :) 如果所有操作都可以在 apache winbind auth 模块下完成,那就太有趣了。然后所有配置都可以封装在 apache 下,就像 kerberos auth 一样。
感谢大家的兴趣、调查和帮助:)