[英]Rewriting inbound Java server authorization headers prior to authentication
我們有一個通過Apache Tomcat提供的REST API,Flash Web應用程序打算與之進行通信。
身份驗證是通過SSL通過基本身份驗證執行的(盡管基本身份驗證中的密碼是SHA-2認證的)。 問題是由於在標題中使用“ WWW-Authentication:Basic”,因此對Flash客戶端使用基本身份驗證會導致出現標准瀏覽器登錄框。 Flash無法通過在請求之前手動設置Authorization標頭來繞過此操作。
其他客戶端需要能夠通過現有機制進行身份驗證,因此重寫身份驗證邏輯將不是理想的選擇。
我的想法是,可以動態重寫發送到Flash Client以及從Flash Client接收的授權標頭,以對Basic auth使用另一個名稱,這將導致瀏覽器不了解auth機制並且不顯示對話框。 可以將往返於Tomcat的身份驗證標頭從“ WWW-Authenticate:Basic”重寫為“ WWW-Authenticate:PretendBasic”,但理想情況下,內置容器安全性仍可以在重寫后處理基本auth。
我編寫了一個過濾器,以將入站標頭重寫為“ WWW-Authenticate:PretendBasic”,將其重寫為“ WWW-Authenticate:Basic”,希望下一個過濾器鏈為auth,並且可以正常處理請求。 不幸的是,Servlet規范指出無法在身份驗證之前插入過濾器。 我認為這項工作的唯一可能性是創建一個可堆疊的JAAS身份驗證模塊,該模塊將首先對來自Flash客戶端的請求執行標頭重寫,然后將身份驗證傳遞給現有的容器管理的安全系統。
因為我不熟悉JAAS,所以我希望社區可以闡明如何實現此目標以及首先它是否是一個好主意。
如果您的Flash應用程序始終可以與受Basic保護的服務器一起使用,則可以在生成對Web服務的第一個請求之前要求提供憑據。 因此,第一個請求將已經包含身份驗證標頭,並且您不會收到401作為響應。
我本以為通過模仿HTTP Basic通過WWW-Authenticate啟用身份驗證將達到目的。
當前正在使用HTTP Basic身份驗證的地方,只需添加另一個使用HTTP Basic的身份驗證器,但針對WWW-Authenticate標頭而不是Authorization標頭。
然后,您可以在Flash中包含標頭,而在該客戶端中忽略HTTP Basic。
我在Jetty上使用3種不同的身份驗證方案進行了類似的操作。 我不確定Tomcat的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.