我的web應用程序有一個登錄頁面,通過AJAX調用提交認證憑證。如果用戶輸入正確的用戶名和密碼,一切都很好,但如果沒有,會發生以下情況:如何禁止瀏覽器的驗證對話框?
- 該網站服務器確定,雖然要求包括一個結構良好的Authorization頭,在頭的憑據做未成功驗證。
- Web服務器返回401狀態碼,幷包含一個或多個WWW-Authenticate標題,其中列出了支持的身份驗證類型。
- 瀏覽器檢測到我對XMLHttpRequest對象的調用的響應是401,響應中包含WWW-Authenticate標頭。然後彈出一個認證對話框,詢問用戶名和密碼。
這一切都很好,直到第3步。我不想彈出對話框,我想要在我的AJAX回調函數中處理401響應。 (例如,通過在登錄頁面顯示錯誤消息。)我希望用戶重新輸入他們的用戶名和密碼,當然,但我希望他們看到我友好,令人放心的登錄表單,而不是瀏覽器的醜陋,默認認證對話框。
順便提一句,我無法控制服務器,因此讓它返回一個自定義狀態代碼(即,除401以外的東西)不是一個選項。
有什麼辦法可以抑制認證對話框嗎?特別是,我能否在Firefox 2或更高版本中禁用「需要身份驗證」對話框?有什麼辦法可以在IE 6及更高版本中禁止連接到[主機]對話框?
編輯
從筆者(9月18日)的更多信息:
我要補充一點,與瀏覽器的身份驗證對話框彈出真正的問題是,它給信息不足以用戶。
用戶剛剛通過登錄頁面上的表單輸入了用戶名和密碼,他認爲他已經正確輸入了他們,並且他點擊了提交按鈕或回車。他的期望是他會被帶到下一頁,或者被告知他錯誤地輸入了他的信息,應該再試一次。但是,他卻出現了一個意外的對話框。
該對話框沒有確認他只是確實輸入了用戶名和密碼。它沒有明確說明存在問題,他應該再試一次。相反,對話框會向用戶顯示隱藏的信息,如「網站說:'[realm]'。」其中[realm]是一個只有程序員才能喜歡的短域名。
Web broswer設計師注意到:如果對話框本身更簡單易用,沒有人會問如何抑制認證對話框。 整個我之所以做登錄表單是因爲我們的產品管理團隊正確地認爲瀏覽器的認證對話框很糟糕。
答案是沒有好的答案。 Marijn提出的黑客手段儘可能接近。當然,如果可能的話,使用服務器和您的JavaScript(而不是瀏覽器)理解的自定義身份驗證也可以實現。 – dgvid 2009-09-30 13:34:25
我一直在同一個問題,並發現這個鏈接的評論在這裏stackoverflow(不是我的博客):http://loudvchar.blogspot.ca/2010/11/avoiding-browser-popup-for-401.html希望它能幫助你。 – gies0r 2013-05-13 18:02:35