Apache2 - 使用 mod_auth_kerb 启用 "don' t 需要登录,但允许它”

标签 apache kerberos

我已经在这方面搜索了好几天,在 mod_auth_kerb 源代码中四处寻找并进行了很多实验,但无济于事,所以我真的希望有人能在这方面为我指明正确的方向......

多年来我一直在使用 Apache::AuthCookie(在 apache 1.x 和 apache 2.x(主要是 2.2.x)上),最近使用 AuthCookie 开发了一个单点登录解决方案(这次仅用于 authz)和 mod_auth_pubtkt 用于针对 AD 后端(通过 LDAP)进行身份验证。一切都很好,现在我正在考虑为在启动 Web 浏览器之前登录到 AD 域的 Windows 用户添加 Kerberos。 这是有效的(为我的单点登录服务器生成的 key 表,它现在可以验证通过用户浏览器和 Apache 发送给它的 Kerberos 票证)但我需要将其设为可选。也就是说,我需要设置 Apache 2.2.x,这样如果 Kerberos header 不在那里进行检查,就不会产生错误或质询(例如,IE 会提示输入凭据,这是我不想要的)。

在我的 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>

Site::NullAuth 是一个非常简单的 mod_perl authen 处理程序,它总是返回“OK”。

随着 mod_auth_kerb 的“KrbAuthoritative”设置为“off”,看起来 Site::NullAuth 一直被调用,而不仅仅是在失败时(即 mod_auth_kerb 没有 Kerberos header ),这是第一个惊喜。如果成功时由 mod_auth_kerb 设置的用户似乎对 Site::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->user 或 $r->prev->user 什么都看不到。

还有什么我可以在这里尝试的吗?

谢谢,

...史蒂夫

最佳答案

SPNEGO 与浏览器的交互方式是这样的:

  1. 来自未经身份验证的用户的请求,没有 session cookie
  2. 服务器代码要求使用 401 响应和“WWW-Authentication: Negotiate”响应 header 进行 Kerberos 身份验证
  3. 浏览器使用服务主体名称的服务票据响应该响应

通常,浏览器会尝试从系统中为用户获取 Kerberos token ,如果没有获取到,则提示输入凭据以创建一个 - 首先创建一个 TGT,然后向 Kerberos 服务器请求 SPN 票证。

因此,您无法避免浏览器的凭据提示对话框,因为如果浏览器支持 Kerberos/SPNEGO 身份验证,您的代码将无法在触发身份验证过程本身之前获取信息。

顺便说一下,如果 SPNEGO 身份验证失败(用户确实取消了凭证提示),由于简单的 cookie 跟踪,您的代码可以回退到另一个身份验证。

关于Apache2 - 使用 mod_auth_kerb 启用 "don' t 需要登录,但允许它”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21260141/

相关文章:

ajax - Apache "_escaped_fragment_"重定向

PHP 显示为文本

apache - 一个 URL 如何被 htaccess 中的多个重写规则修改?

.net - 使用 CredentialCache.DefaultNetworkCredentials 代表当前用户发送电子邮件

hadoop - 保护Hadoop集群

Apache ProxyPass 删除 Authorization header

java - 在 Java 6 上运行的 JMX 客户端/服务器上支持 Kerberos 身份验证/授权

java - Spring Boot 2 kerberos 身份验证

java.lang.IllegalArgumentException : ResourceLoader must not be null in Spring

php - htaccess RewriteRule url 友好搜索