2014-01-21 60 views
3

我已經搜索了這一天的日子,在mod_auth_kerb源代碼中探索並嘗試了很多,但都無濟於事,所以我真的希望有人能指出我在這一個正確的方向...Apache2 - 使用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。 這是行得通的(keytab爲我的單一登錄服務器生成,現在可以驗證通過用戶的瀏覽器和Apache發送給它的Kerberos票據),但我需要將其設置爲可選。也就是說,我需要設置Apache 2.2.x,以便如果Kerberos標頭不在那裏檢查,則不會出現任何錯誤或挑戰(例如,IE會提示輸入憑據,我不希望這樣做)。

在我的SSO CGI代碼中,我基本上想知道是否已經填充了$ ENV {REMOTE_USER}(通過mod_auth_kerb),如果是,則相應採取行動,如果不是,則執行我現在要做的事情(請求用戶在表單中聲明,認證到LDAP服務器並繼續)。

我認爲這會工作:

<Location /whatever> 
    AuthName DualExp 
    AuthType Kerberos 
    KrbAuthRealms mumble 
    KrbServiceName HTTP/[email protected] 
    Krb5Keytab /etc/apache2/my.krb5tab 
    KrbMethodNegotiate on 
    KrbMethodK5Passwd off 
    KrbLocalUserMapping on 
    KrbAuthoritative off 
    require valid-user 
    AuthType Site::NullAuth 
    PerlAuthenHandler Site::NullAuth->always 
</Location> 

如果網站:: NullAuth是一個非常簡單的mod_perl認證介紹處理程序,它只是返回「OK」始終。

當mod_auth_kerb的「KrbAuthoritative」設置爲「off」時,它看起來像Site :: NullAuth一直在調用,而不僅僅是在失敗時(即沒有用於mod_auth_kerb的Kerberos頭),這是第一個意外。如果成功設置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->用戶或$ R-> prev->用戶。

有沒有人有任何我可以在這裏嘗試?

感謝,

...史蒂夫

回答

1
與瀏覽器

SPNEGO交互這樣工作:

  1. 從沒有認證的用戶,沒有會話cookie
  2. 服務器代碼詢問請求使用401響應和「WWW身份驗證:協商」響應標頭的Kerberos身份驗證
  3. 瀏覽器對該響應的答案服務票證服務主體名稱

一般瀏覽器嘗試獲取來自系統用戶的Kerberos令牌,如果它得到無,提示輸入憑據來創建一個 - 首先創建一個TGT,然後要求對SPN票Kerberos服務器。

因此,您無法避免瀏覽器的憑證提示對話框,因爲如果瀏覽器在觸發驗證過程本身之前支持Kerberos/SPNEGO驗證,則代碼無法獲取信息。順便說一下,如果SPNEGO身份驗證失敗(用戶取消了憑證提示),那麼由於簡單的Cookie跟蹤,您的代碼可以回退到另一個身份驗證。

0

有沒有簡單的方法可以使它與I.E一起工作。我最終做的是使用mod_rewrite來篩選出所有來自異地的IE客戶端,並希望所有本地IE客戶端都有票。 rfc 1918地址用於隱藏我們的真實地址。

# Add a rewrite rule for offsite hosts 

RewriteEngine On 
RewriteLog /etc/httpd/logs/ssl_rewrite_log 
RewriteLogLevel 2 

# IE fails hard if the user does not have a tgt for SPNEGO 
# and either attempts NTLM or fails altogether depending on 
# exact version. Redirect all "offsite" login attempts to 
# form rather than attempt pass-thru SPNEGO login. 

RewriteCond %{HTTP_USER_AGENT}   ^Mozilla.*MSIE 
RewriteCond %{REMOTE_ADDR}   !^172\.16\..*$ 
RewriteRule ^/login/   /login-simple/ [PT]