我使用以下方式实现了 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。