2009-05-29 40 views
7

我的ASP.NET 2.0應用程序創建HTTPWebRequest到公司內部網絡中的一個站點,該站點使用NTLM身份驗證。傳遞的憑據是一個服務帳戶,該帳戶在域認證成功(安全日誌證實了這一點)通過重定向驗證HttpWebRequest,持久性憑據?

一些縮寫代碼如下..

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, 
       pwd, domain); 
req.Credentials = cred; 

HttpWebResponse response = req.GetResponse() as HttpWebResponse; 

作爲請求的一部分,有一對夫婦(在同一個域中)到最終響應 - 在我的開發機器上處理OK(Windows 2k)

當從我的部署環境(Windows 2k3)創建此請求時,我得到一個401 Unauthorized錯誤返回從該網站,似乎在第一個重定向代碼返回(301移動)後,我的請求對象t嘗試遵循重定向。

所以基本上,有沒有人知道任何關於重定向遵循驗證的HttpWebRequests的問題?

PS - 最明顯的解決方法是簡單地請求重定向到的頁面 - 但我負責的內部網站的管理員要通過重定向我通過一個特定的頁面來監控我的應用程序的使用。

+0

你看了您的網絡流量(例如使用Fiddler)以查看客戶端是否作出任何客戶端認證試圖重定向的最終目標? 未能自動向重定向服務器進行身份驗證可能是.NET內部的一項安全措施,可防止無意的憑據泄露。 – EricLaw 2009-07-18 18:09:47

+0

我面臨同樣的問題,仍然無法解決問題。 http:// stackoverflow。com/questions/3562979/making-a-web-request-to-a-web-page-which-requires-windows-authentication – 2010-08-26 07:51:52

回答

11

要使HttpWebRequest跨重定向重用憑據,您需要使用憑證緩存。 如果你只是分配一個NetworkCredentials對象,它只會用於第一個請求。

下面是一個例子:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}}; 
req.Credentials = cache; 
HttpWebResponse response = req.GetResponse() as HttpWebResponse; 
1

這將取決於您的身份驗證。計劃的作品。網絡憑據只會對if的NTLM部分有所幫助。我懷疑您嘗試訪問的網站也使用表單身份驗證。如果是這種情況,當你登錄時你應該得到一個授權cookie,你需要將它包含在隨後的請求中,例如,重定向後。我認爲WebRequest對象有一個可用於保存cookie的頭文件集合。當您平常瀏覽時,使用fiddler或firebug來查看會遇到什麼可能是個好主意。

-1

如果您使用NTLM,這是經典的2跳問題。它可以在你的開發機器上運行,因爲客戶機和服務器在同一個機器上,憑證最多隻能傳遞一次(到我猜測的重定向最終目標機器上)

當你部署到你的產品環境時,涉及3臺機器。客戶端瀏覽器將憑據傳遞給server1,然後server1嘗試將憑據傳遞給不允許的server2。一個解決辦法是實現Kerberos身份驗證(更嚴格的協議),它將允許server1將憑據傳遞到服務器2