2009-10-23 106 views
6

我正在設計一個RESTful Web服務(JBoss + RESTeasy)。 UI程序員正在編寫一個將使用它的Ajax Web應用程序。 Web應用程序將是一個HTML頁面,其中所有內容都是用JavaScript完成的。爲了安全起見,所有流量都通過SSL。Ajax認證,不讓瀏覽器彈出登錄對話框

當前我正在使用基本身份驗證。 UI程序員可以顯示一個對話框來獲取用戶名和密碼,並在標題中放入「Authorization:Basic xxxxx」。不幸的是,如果密碼錯誤,會出現難看的瀏覽器登錄對話框。此外,用戶無法註銷。這是無法接受的。

那裏看來是沒有辦法攔截任何我們將使用瀏覽器的401響應一個XMLHttpRequest。

基於表單的身份驗證不適用於我們。我們需要在一段時間不活動後自動註銷(相當於會話超時)。當客戶端期望一個JSON對象時,我們不能讓服務器突然返回一個登錄頁面。

的JBoss提供了四種驗證策略:BASIC,FORM,CLIENT-CERT和消化。我認爲DIGEST與BASIC有同樣的問題。四個都不是我們想要的。

此Web應用程序將是唯一的客戶端(現在)所以不需要使用BASIC。是否有任何其他身份驗證策略可以安裝?例如,我可以使用WSSE UsernameToken的實現嗎? (如O'Reilly RESTful Web服務手冊第8章所述。)服務器將在WWW-Authenticate頭部中發送「WSSE」而不是「Basic」,並且可能瀏覽器會忽略它並將其傳遞給它。

我要配置安全性,它屬於 - 在JBoss的配置文件,而不是在我的RESTful Web服務 - 所以我在尋找一個實現我可以插入JBoss的。

回答

7

的瀏覽器不會出現密碼對話框,如果它不承認在WWW身份驗證標頭的身份驗證方案。您最好的選擇可能是繼續在服務器上使用基本身份驗證,而手動將標頭設置爲類似「Basic/MyApp」的401響應。

+0

驗證在請求到達Web服務之前完成。我可以通過編寫一個位於安全框架之前的過濾器來處理這個問題嗎?然後我可以告訴網絡程序員在第一個請求中添加一個「Authorization:Basic/MyApp」標頭。過濾器可以將其重寫爲「Authorization:Basic」,並在響應中將「WWW-Authenticate:Basic」標題重寫爲「WWW-Authenticate:Basic/MyApp」。任何其他客戶端都可以使用普通的基本認證這會工作嗎?我認爲可能。 – 2009-10-26 02:00:02

+0

嗯......我假設你已經在服務器上的腳本級別上控制了身份驗證,並且在處理身份驗證之後但在返回響應之前設置標題。我對JBoss並不太熟悉,但是如果你可以在auth發生之前過濾和重寫請求,聽起來好像它是你最好的選擇。通過在Web應用程序中設置授權標頭,普通客戶端不會受到影響。尼斯。 – 2009-10-26 05:41:58

+0

事實證明,您不能擁有預登錄過濾器。 WebLogic服務器允許它,但標準不允許它,而JBoss和Tomcat不允許它。看起來我不得不擺弄JAAS來做到這一點。 – 2009-10-26 19:27:37

相關問題