我成功配置了 ntlm 身份验证。不幸的是,配置允许半基本授权。例如,当我使用 tortoise svn1.8.4(带有 serf 访问库)、chrome 或 IE 网络浏览器时,它们会成功验证 NTLM 而不会提示任何内容。在日志文件中,我看到经过身份验证的用户。不幸的是,当我使用例如未配置的 FireFox 或 Maxthon 时,浏览器会提示我输入凭据。我不需要这个,因为同样的情况是当我尝试从域外计算机访问时。
我使用 windows 服务器作为域控制器,windows7/8 作为系统客户端,linux/debian 作为 web 服务器。我从 linux do windows AD 配置了 kerberos,为本地 NTLM 身份验证和 apache 2.2 系列配置了 winbind。对于 apache 身份验证胶,我使用 mod_auth_ntlm_winbind.so apache2 模块,并在目录/位置配置 ntlm helper 下与 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 的身份验证 ntlm 和提示凭据,我总是看到 AUTH_TYPE 总是 NTLM。那么就没有办法识别浏览器做了什么。在那种情况下,我可以从域外的客户端访问。
我尝试通过 strace 包装 ntlm hepler。不幸的是,我没有看到任何重要的转储与四种方式结合成功/失败的身份验证和 IE 非提示 ant FF 提示的访问。我认为当 ntlm helper 对本地 samba 服务器进行身份验证时会发生同样的情况,但我从未对此进行过测试。
现在我正在尝试使用多种身份验证类型、基本和 NTLM 进行一些配置。我先尝试做 Basic 并过滤掉这个总是失败并将其重定向到信息页面。不幸的是,现在 NTLM 组合没有成功:( NTLM 总是先完成。
那么有人知道如何防止凭据提示吗?如何撤销提示客户的访问权限?如何识别凭据是来自提示符还是来自 Windows 客户端 api?
使用 NTLM 身份验证并不能保证无凭据登录。如果您拥有服务器可以识别的有效 Windows 凭据,您将不会收到密码提示。
如果用户没有有效的 NTLM 传递凭据,系统将提示他们提供这些凭据。无法恢复到“基本”身份验证。
不幸的是,无法判断用户是否提供了凭据,或者它们是否被系统传递。
也许问一个新问题,概述您希望您的用户体验什么(即内部和外部用户的不同站点),有人可能会以不同的方式提供帮助。
现在我解决了将 NTLM 切换到 Kerberos 身份验证的问题。所有为winbind准备的都是直接在kerberos下工作的,因为我之前配置了kerberos for winbind与AD服务器通信。由于 kerberos 是开放的,因此开发人员预测了用户端点上的不同子身份验证。apache2.2 kerberos 模块中的标志非常有用:
这导致了我想要的。浏览器获取具有属性“不要弹出用户 fo 凭据”的 krb 框架,然后客户端根本不这样做。但如果是(任何不兼容?),apache 服务器模块应该检测到这一点并应该撤销身份验证。
使用微软的 NTLM 这是不可能的,因为协议被破坏了。Web 返回代码 201 之后的第一个 NTLM 帧不可能添加属性“不提示用户输入凭据”。然后我可以在弹出窗口或操作系统会话键签名后过滤该帧。当操作系统会话密钥不可用时,这会导致浏览器始终显示弹出窗口。
最终是另一个机会。用户需要一些时间来编写凭据,或者在凭据存储在浏览器中时接受。我可以计算向浏览器发送身份验证帧和从客户端传入帧之间的时间。当时间太长我可以撤销。不幸的是,这可能会在繁忙的计算机或网络上造成虚假的未经身份验证。
将来我会尝试这两种方法:) 如果一切都可以在 apache winbind auth 模块下完成,那将会很有趣。然后所有配置都可以封装在apache下,就像kerberos auth一样。
谢谢大家的有趣,调查和帮助:)