如何告诉 mod_auth_kerb 在没有“需要有效用户”的情况下完成其工作

如何告诉 mod_auth_kerb 在没有“需要有效用户”的情况下完成其工作

我使用以下方式实现了 SSO 身份验证mod_auth_kerb在 Apache 上。我的配置如下:

<Location /login/ >
    AuthType Kerberos
    AuthName "Kerberos Login"
    KrbMethodNegotiate on
    KrbAuthoritative on
    KrbVerifyKDC on
    KrbAuthRealm D.ETHZ.CH
    Krb5Keytab /etc/HTTP.keytab
    KrbSaveCredentials on
    RequestHeader set KERBEROS_USER %{REMOTE_USER}s
</Location>

我的问题是,如果没有require valid-user,mod_auth_kerb 甚至不会尝试对用户进行身份验证,KERBEROS_USER最终会变成(null)。如果我添加require valid-user,如果浏览器支持,则会自动对用户进行身份验证,但如果浏览器不支持 Kerberos Negotiate,则会显示一个丑陋的模态登录表单(ala HTTP Basic Auth)。

我想要实现的是,如果用户访问/login/,mod_auth_kerb 会尝试通过 Kerberos Negotiate 验证用户身份。如果验证失败,则会向用户显示普通的 HTML 登录表单。

是否可以以这种方式配置 Apache/mod_auth_kerb?

答案1

我曾经在构建一个简单的单点登录工具(将 Kerberos 与 mod_auth_tkt 合并)时做过一次这样的事情。这需要一点小技巧:

  • /webauth/login 受到require valid-user指令的保护。如果有人使用有效的 Kerberos 凭据进行连接,我们会从 REMOTE_USER 获取其用户名,为他们提供身份验证 cookie,然后将其发送给他们。

  • Apache 配置使用ErrorDocument请求将未经身份验证的用户重定向到 /webauth/require_authentication:

    错误文档 401 /webauth/require_authentication

    这将执行以下操作:

    • 返回 401 结果代码(通常,ErrorDocuments 会吃掉你的结果代码),并且
    • 提供登录表格。
  • 登录表单将完全按照您的预期执行:提供用户名/密码表单,验证相同,然后向他们提供身份验证 cookie。

相关内容