一個主機名上的多個 SPNEGO 認證 Web 伺服器
我試圖使用SPNEGO servlet 過濾器和偵聽埠 8080 設置 Java 服務,以便在也執行 IIS7 中託管的 Web 應用程序的主機上進行身份驗證。
我按照 SPNEGO 安裝說明創建了一個 SPN
HTTP/canonical.host.name
,綁定到執行 Java 服務身份驗證的使用者。在此更改之後,Java 服務能夠通過 SPNEGO 對客戶端進行身份驗證,但是使用自定義身份(即使用者名而不是 ApplicationPoolIdentity)執行的 IIS7 應用程序池突然無法進行身份驗證。
我在這裡不明白的是:
- 當沒有
HTTP/canonical.host.name
定義使用的 SPN(通過檢查setspn -Q
)時,Kerberos 身份驗證如何為 IIS 工作?客戶端仍然請求和接收正是該 SPN 的票證。- 出於興趣,我們嘗試使用成功驗證的 Java 服務的身份執行應用程序池。只要定義了 SPN,它仍然無法工作 - 嘗試使用 Kerberos 票證進行身份驗證失敗並
KRB_AP_ERR_MODIFIED
返回。以註冊 SPN 的使用者身份執行應用程序池不會更改此行為。- Microsoft指定SPN 包含埠號,但 IE 不遵守此規定,並且從不在 SPN 中發送埠號(Firefox 和 Chrome 遵循此行為)。
那麼,有沒有辦法在同一主機上擁有多個獨立的 SPNEGO 認證服務?
最後一個:對於同一主機上的多個 SPNEGO 身份驗證服務,無需擺弄 IE 系統資料庫項,使用不同的名稱。
• 當沒有使用(通過setspn -Q 檢查)定義的HTTP/canonical.host.name 的SPN 時,Kerberos 身份驗證如何為IIS 工作?客戶端仍然請求和接收正是該 SPN 的票證。
這是基於
HOST\boxname
SPN 的自動回退,它是在加入域時為所有電腦創建的 - 如果 DC 沒有按照客戶端應用程序的請求找到 SPECIFICSERVICE\boxname 的匹配項,它將提供基於 HOST 的票證\框名。用於
SETSPN -L boxname
列出與安全主體(使用者或電腦帳戶)關聯的 SPN。• 出於興趣,我們嘗試使用成功驗證的 Java 服務的身份執行應用程序池。只要定義了 SPN,它仍然無法工作 - 嘗試使用 Kerberos 票證進行身份驗證失敗並返回 KRB_AP_ERR_MODIFIED。以註冊 SPN 的使用者身份執行應用程序池不會更改此行為。
IIS 7 的預設設置是 useAppPoolCredentials=false, and useKernelMode=true ;必須切換其中之一或兩者,以便應用程序池身份用於解碼 kerberos 票證。
•Microsoft 指定SPN 包含埠號,但IE 不遵守此規定,並且從不在SPN 中發送埠號(Firefox 和Chrome 遵循此行為)。
回到問題的真正癥結:當其他一切都修復時,IE 和其他預設情況下仍然不會包含埠號,因此最少修改的解決方案是簡單地在同一個盒子上執行不同的主機頭。
另請注意,由於另一種 IE 行為(使用相同的參數反對更改所有客戶端的系統資料庫設置),CNAME 不是一個好的選擇,請改用 A 記錄。