Bagaimana cara memberitahu mod_auth_kerb untuk melakukan tugasnya meskipun tidak ada "memerlukan pengguna yang valid"

11

Saya menerapkan otentikasi SSO menggunakan mod_auth_kerb di Apache. Konfigurasi saya terlihat seperti ini:

<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>

Masalah saya adalah, tanpa require valid-user, mod_auth_kerb bahkan tidak mencoba untuk mengotentikasi pengguna dan KERBEROS_USERakhirnya menjadi (null). Jika saya menambahkan require valid-user, pengguna diautentikasi secara otomatis jika browser mendukungnya, tetapi akan ditampilkan formulir masuk modal jelek (ala HTTP Basic Auth) jika browser tidak mendukung Negosiasi Kerberos.

Yang ingin saya capai adalah bahwa jika pengguna mengunjungi /login/, mod_auth_kerb mencoba untuk mengotentikasi pengguna melalui Negosiasi Kerberos. Jika gagal, formulir masuk HTML normal akan disajikan kepada pengguna.

Apakah mungkin mengkonfigurasi Apache / mod_auth_kerb sedemikian rupa?

Benjamin Wohlwend
sumber
Kecuali Anda menyediakan formulir masuk dan penanganan kesalahan yang sesuai, ini adalah perilaku yang tepat (diharapkan).
BillThor

Jawaban:

12

Saya pernah melakukan ini ketika saya membangun alat signon tunggal sederhana (untuk menggabungkan Kerberos dengan mod_auth_tkt). Itu membutuhkan sedikit ketidakjujuran:

  • / webauth / login dilindungi oleh require valid-userarahan. Jika seseorang terhubung dengan kredensial Kerberos yang valid, kami mendapatkan nama pengguna mereka dari REMOTE_USER, memberi mereka cookie otentikasi, dan mengirimkannya dalam perjalanan.

  • Konfigurasi Apache menggunakan ErrorDocumentpermintaan untuk mengarahkan pengguna yang tidak diautentikasi ke / webauth / require_authentication:

    ErrorDocument 401 / webauth / require_authentication

    Ini akan melakukan tindakan berikut:

    • Kembalikan kode hasil 401 (biasanya, ErrorDocuments memakan kode hasil Anda), dan
    • Sajikan formulir masuk.
  • Formulir login akan melakukan persis apa yang Anda harapkan: menyajikan formulir nama pengguna / kata sandi, memvalidasi yang sama, dan kemudian memberi mereka cookie auth.

larsks
sumber
+1 untuk solusi yang menarik.
Sam Halicke
Hebat, ini bekerja dengan sempurna!
Benjamin Wohlwend