Я реализовал аутентификацию 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
, пользователь автоматически аутентифицируется, если браузер поддерживает это, но ему показывается уродливая модальная форма входа в систему (например, HTTP Basic Auth), если браузер не поддерживает Kerberos Negotiate.
Я хочу добиться того, чтобы если пользователь посетил /login/
, mod_auth_kerb пытается аутентифицировать пользователя через Kerberos Negotiate. Если это не удается, пользователю будет представлена обычная HTML-форма для входа.
Можно ли таким образом настроить Apache / mod_auth_kerb?
Я сделал это один раз, когда создал простой инструмент единой регистрации (для объединения Kerberos с mod_auth_tkt). Потребовалось немного ухищрений:
/ webauth / логин был защищен require valid-user
директива. Если кто-то подключался с действительными учетными данными Kerberos, мы получали его имя пользователя от REMOTE_USER, давали ему файл cookie аутентификации и отправляли его по пути.
В конфигурации Apache использовался ErrorDocument
запрос на перенаправление неаутентифицированных пользователей на / webauth / require_authentication:
ErrorDocument 401 / webauth / require_authentication
Это приведет к следующим действиям:
Форма входа будет делать именно то, что вы ожидаете: представить форму имени пользователя / пароля, подтвердить ее, а затем передать им cookie аутентификации.