我已经搜索了几天,在mod_auth_kerb源中戳了几天,并进行了很多实验,因此无济于事,所以我真的希望有人可以指向正确的方向。在这个...
我已经与Apache :: Authcookie(在Apache 1.x和Apache 2.x(2.2.x)(主要是2.2.x)上工作了多年),最近使用Authcookie开发了单个登录解决方案(仅此一次)和mod_auth_pubtkt用于针对AD后端的身份验证(在LDAP上)。一切都很好,现在我正在考虑将kerberos添加到启动网络浏览器之前登录到广告域的Windows用户中。这是在工作(为我的单个Signon服务器生成的KeyTab,现在可以通过用户的浏览器和Apache验证Kerberos门票),但我需要使其可选。也就是说,我需要设置Apache 2.2.x,以便如果没有Kerberos标头要检查,则没有创建的错误或挑战(例如,我不想要的凭据提示)。<<<<<<<</p>
在我的SSO CGI代码中,我基本上想查看$ env {remote_user}是否填充了(由mod_auth_kerb),并相应地采取行动,如果不是这样,请做我现在做的事情(询问用户的以形式的信用,向LDAP服务器进行验证,然后以这种方式继续)。
我认为这会起作用:
<Location /whatever>
AuthName DualExp
AuthType Kerberos
KrbAuthRealms mumble
KrbServiceName HTTP/mumble@blah
Krb5Keytab /etc/apache2/my.krb5tab
KrbMethodNegotiate on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbAuthoritative off
require valid-user
AuthType Site::NullAuth
PerlAuthenHandler Site::NullAuth->always
</Location>
wery site :: nullauth是一个非常简单的mod_perl authen处理程序,始终返回" ok"。
随着mod_auth_kerb的" krbauthoritative"设置为"关闭",它看起来像是网站:: nullauth一直被调用,而不仅仅是失败(即。如果MOD_AUTH_KERB在成功方面设置的用户似乎不可用:: Nullauth。由于Nullauth被最后打电话给我,因此我最终没有用户集。或者至少我认为正在发生的事情。在Nullauth中,我正在这样做以检查用户:
sub always {
my ($auth_type, $r) = @_;
my $auth_user = $r->user;
my $prev_user = "";
$prev_user = $r->prev->user if $r->prev;
$r->server->log_error("user authenticated as $auth_user and prev is $prev_user");
return OK;
}
,对于$ r->用户或$ r-> prev->用户看不到任何东西。
有人还有我可以在这里尝试的其他任何东西吗?
谢谢,
... Steve
spnego与浏览器的互动以这种方式工作:
- 未经认可的用户的请求,没有会话cookie
- 服务器代码要求使用401响应和" www-authentication:谈判"响应标题 进行Kerberos身份验证
- 浏览器通过服务主名称的服务票来回答该回复
通常,浏览器试图从系统中获取用户的Kerberos令牌,如果没有获得凭据,请提示创建一个凭据 - 首先创建一个TGT,然后要求SPN Ticket to Kerberos Server。
。结果,您无法避免浏览器的凭据提示对话框,因为如果浏览器支持Kerberos/Spnego身份验证,则代码将无法获取信息,然后再触发身份验证过程本身。
顺便说一句,如果Spnego身份验证失败(用户确实取消了凭据提示),则您的代码可以通过简单的cookie跟踪来退缩到另一个身份验证。
没有简单的方法可以使它与之搭配。我最终要做的是使用mod_rewrite筛选所有来自现场的IE客户端,只希望所有本地IE客户端都有门票。RFC 1918地址用于隐藏我们的真实地址。
# Add a rewrite rule for offsite hosts
RewriteEngine On
RewriteLog /etc/httpd/logs/ssl_rewrite_log
RewriteLogLevel 2
# IE fails hard if the user does not have a tgt for SPNEGO
# and either attempts NTLM or fails altogether depending on
# exact version. Redirect all "offsite" login attempts to
# form rather than attempt pass-thru SPNEGO login.
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*MSIE
RewriteCond %{REMOTE_ADDR} !^172.16..*$
RewriteRule ^/login/ /login-simple/ [PT]