3

當用戶未經授權訪問頁面時,我發送HTTP 401.此外,根據HTTP/1.1 spec的要求,我還發送了一個WWW-Authenticate標題。如何禁止由WWW-Authenticate頭引起的登錄對話框?

我知道至少有一種情況,忽略此標題會導致一個問題:Firebug(Net標籤將爲空)。

用戶可以使用電子郵件地址或用戶名以及密碼登錄。表單通過AJAX提交,JSON響應負責在成功登錄後重定向用戶,或在失敗時顯示錯誤消息。

在Windows Phone 8上,當出現此標題時會顯示自定義對話框。它的域名爲用戶名,密碼域名。它也有複選框顯示密碼請記住我的密碼
問題是,這個對話根本不適用於應用程序的認證過程。

標題的值似乎並不重要,我試着用WWW-Authenticate: formWWW-Authenticate: blah,但我無論如何都得到了對話。我怎樣才能抑制這一點,同時仍然堅持規範?

+1

'表單通過AJAX提交 - 這是否意味着您通過html表單發送用戶/密碼?在這種情況下,你不應該使用'WWW-Authenticate',實際上甚至不使用'401',因爲它們是標準化HTTP認證的一部分,客戶端通過'[Authorization](http:// www。 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8)'標題。但基於表單的身份驗證不是標準化的,HTTP並不爲您提供任何特殊的支持。 –

+0

@Eugene我想多個來源給出相同的建議(SO帖子,博客等)並不總是意味着這是正確的建議。說爲標題使用自定義值會導致未定義的行爲是否正確?你可以發佈這個答案,所以我可以接受和獎勵賞金?謝謝! – Stijn

+0

@Eugene在閱讀你的評論後,我發現[this](http://webmasters.stackexchange.com/a/24452/21304),確認你寫了什麼。 – Stijn

回答

2

從您的問題和意見看來,您似乎正在進行基於表單的身份驗證,但爲了符合HTTP規範,您認爲您應該返回401,並且,因爲這還需要發送WWW-Authenticate標頭,你也添加了。

事實是:基於表單的身份驗證是非標準的,您不應該使用401未經授權的,它將與標準HTTP身份驗證一起使用。因此,使用虛擬身份驗證方法可能會幫助您在WWW-Authenticate方面符合規範的字母,但您首先不應該使用401。

spec讀取:

10.4.2 401未經授權

請求需要用戶認證。響應必須包含一個WWW-Authenticate頭域,其中包含一個適用於請求資源的挑戰。客戶端可以用合適的授權標題字段重複請求。

所有這些談論HTTP標頭(WWW-AuthenticateAuthorization)清楚地表明,這是給予客戶端軟件(通過在大多數情況下,一個對話框)做標準的HTTP認證所需的信息。

順便說一句,提供在WWW-Authenticate頭一個自定義的驗證方法是有道理的,當你想通過該Authorization HTTP頭的認證,即,而是使用自己的身份驗證方案,而不是基本消化。這當然需要一個瞭解該定製方案的客戶。

那你能做些什麼呢?由於表單身份驗證是非標準的,因此未在規範中定義,但是如何使用307 Temporary Redirect將用戶重定向到登錄表單的頁面,可能會添加信息,以便您可以自動將用戶重定向回頁面他想在驗證憑據後訪問。