2013-01-23 120 views
3

我正在面對我正在處理的應用程序出現Ajax問題。該Web應用程序是用ASP.NET 4.5編寫的,它是從Visual Studio 2012中的默認MVC示例應用程序派生出來的。該應用程序駐留在本地IIS服務器上(不是快速版本),並且需要Windows身份驗證(當前爲NTLM)對於安全原因的客戶端模仿。JQuery Ajax + Windows身份驗證= 401未授權

我在這裏有2個問題。

  1. 瀏覽,但對於一些模糊的原因,所有的Ajax調用在401未授權錯誤失敗(它使用匿名身份驗證時,工作時,該網站是正確驗證客戶,所以我猜憑據不會在請求封裝? !)。我還沒有時間去調查他們之間的溝通,但我確信這裏的一位大師能夠提供幫助。

  2. 最後,Windows身份驗證提供程序將被移動到Kerberos。關於這個Ajax問題有什麼特別要小心?

如果您需要任何其他信息,請讓我知道。

編輯1

我覺得愚蠢...重新啓動IIS解決問題。有些IT很高興...

感謝大家。

+0

它可能是一個瀏覽器問題。你使用的是什麼瀏覽器?我不知道Windows身份驗證,但我知道從使用Firefox執行Kerberos的經驗,你必須添加一些配置條目到瀏覽器才能正常工作。 –

+0

Chromium22和IE8都具有相同的行爲。是的,我也使用--auth-server-whitelist來調用鉻,但是這對於以後的版本來說也是如此。我會谷歌一點,這是一個好主意,謝謝。 – dna

+0

你曾經解決過這個問題嗎?我遇到了一個非常類似的問題。在收到帶有WWW-Authenticate 401的401後,Chrome不會進行協商:通過AJAX請求進行協商。 – jmh

回答

6

以下答案基於我對NTLM/Kerberos的理解,以及一些關於XmlHttpRequest如何重用瀏覽器已知信息的猜測。但是,我實際上沒有嘗試重現您的情況,因此我有可能錯誤。

好吧,在這裏。 NTLM會話是一個面向連接的協議。這意味着如果您的服務器不斷返回「Keep-alive」並且客戶端重用相同的連接,則不需要另一次身份驗證握手。但是,正如連接關閉並再次打開一樣,需要新的握手。只要這是請求服務器的瀏覽器,新握手就會使用瀏覽器內存中緩存的憑證自動完成,這是您在初始握手時提供的確切憑據。

這就是爲什麼我相信你的ajax調用不起作用 - 它可能只是打開一個新的連接,並需要新的握手(似乎出於某種原因,它不會重用緩存在瀏覽器內存中的憑證)。

但是,如果您切換到Kerberos,這應該會改變。 Kerberos基於挑戰 - 響應模式,瀏覽器和服務器直接與身份驗證授權機構聯繫。然後,kerberos使用一張票保持您的http頭上的身份驗證。標題將被自動添加到您的AJAX請求中。

請注意,與NTLM相反,只有在瀏覽器和服務器都可以聯繫身份驗證權限的情況下,Kerberos才能正常工作。這就是爲什麼通常在IIS中將「Negotiate」設置爲身份驗證方案的原因 - 這會首先嚐試Kerberos,然後在驗證權限不直接提供給瀏覽器的情況下切換回NTLM。

+0

是的,這可能是由於一個無效的KeepAlive設置,我會盡快查看交通情況。謝謝。 – dna

相關問題