2011-08-31 20 views
5

我的C#應用​​程序訪問使用NTLM身份驗證的Web服務器。如何跨多個HttpWebRequest共享NTLM認證?

我發現每個向服務器發出的請求(使用新的HttpWebRequest)都是單獨驗證的。換句話說,每個請求都會產生一個401響應,然後在我得到實際響應之前發生NTLM握手對話。

如:

第一GET請求:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM) 

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM base64stuff) 

-> GET xyz (Authorization: base64stuff) 
<- 200 

後續請求:

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided? 

-> GET xyz (Authorization: base64stuff) 
<- 200 

(最初,與預先驗證設置爲false,後續請求看起來像第一個請求 - 即每個「請求」有三個底層請求)

是否有用後續的HttpWebRequests將第一個請求上執行的認證「共享」到服務器的方式?

我想也許UnsafeAuthenticatedConnectionSharing屬性將允許我這樣做,但將其設置爲true對於應用程序中使用的所有HttpWebRequest對象都沒有影響。

但是,如果我將PreAuthenticate設置爲true,則會在第一個請求之後發生一次少於401次的響應。

+0

什麼問題是你想解決? –

+0

我想有效'做認證'一次,並跨HttpWebRequests重複使用。而不是每次我點擊服務器時進行身份驗證。儘管我可能會誤解NTLM,實際上NTLM會對每個請求額外請求開銷。 – mackenir

+0

是的,但現在它的工作方式有什麼問題,它將如何解決將您描述的行爲改變爲您所期望的行爲的問題,您想在現實世界中實現什麼。 –

回答

3

執行NTLM後發送的最後一個請求(導致200響應的請求)包含一個auth標頭,告訴服務器您擁有正確的憑證。

我不確定客戶端類是否具有保留此功能的功能,但如果您發現某種方法來保留此標頭並將其添加到後續請求中,它應該可以正常工作。


更新:NTLM驗證連接,因此您需要使用Keep-Alive頭保持連接打開狀態。客戶端類應爲此提供一些設置。欲瞭解更多信息,請參閱此頁,我覺得這對NTLM方案非常有用的,明確的:

http://www.innovation.ch/personal/ronald/ntlm.html

+0

嗯。可以在HttpWebRequest上設置授權標頭,我試過了。然而,它不起作用 - 服務器返回400錯誤請求,表明授權標頭不能以這種方式「重播」。出於安全原因,我認爲這是有道理的。 – mackenir

+0

查看我上面的編輯 – Iravanchi

+0

經過一小段時間的測試,看起來像,儘管HttpWebRequest有一個KeepAlive屬性,但它不會改進PreAuthenticate = true的設置。有點煩人。 – mackenir