我在NTLM地獄在這裏,希望你能幫助識別我失蹤的東西。HttpWebRequest「keep-alive」頭部被丟棄
我最終試圖將SSRS報告發送到瀏覽器中的一個框架,只有報告中的圖像給我帶來很大的悲傷。除非用戶使用Firefox並輸入憑證兩次,第一次用於報告,第二次用於報告中的圖像,否則不會顯示。
我正在使用HttpWebRequest獲取SSRS報告。
我收到HTML流後,向Web服務器(IIS 7.5)發送帶有「NTLM」和有效憑據的憑證緩存,嘗試從SSRS獲取圖像,以便我可以將它們存儲在本地並引用它們將緩解用戶不得不一次又一次地重新輸入憑證。
我在Fiddler看到在NTLM握手過程中遇到了類型1,2和3的挑戰,但最終的迴應是500內部服務錯誤。響應文本還顯示rsStreamNotFound,但是,我發現旁邊沒有任何信息,這意味着什麼,我認爲這是真正的問題可能是誤導。
當我使用Firefox時,Firefox會提示我輸入報告的網絡憑據,然後再次顯示圖像,然後將圖像恢復。我的HttpWebRequest失敗,500內部服務器錯誤,rsStreamNotFound。
我可以在Firefox請求和我的請求之間的請求頭文件中看到的唯一區別是,從我的編程請求中刪除了「keep-alive」屬性,並且Firefox請求將它放在那裏。
爲什麼我的「保持活力」被丟棄?
在這一點上,這是我的請求和Firefox的請求之間的唯一區別,所以我想在跳轉到任何其他結論之前消除這種差異。
我試過的變化:
req.KeepAlive = true;
req.PreAuthenticate = true;
,這寶石:
var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);
這裏是CredentialCache:
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new Uri(path), "NTLM", NetCredentials);
...和 「保活」 不出現在我的HttpWebRequest的請求中,並且Firefox有 - 它爲什麼會丟失?
更新:
我想:
using (WebClient client = new WebClient()) {
client.DownloadFile(url, filePath);
}
...和我有401未授權,所以我試着用憑證,並獲得500內部服務器錯誤
代碼正在服務器上運行。這些是http獲取對資源的調用。事實證明,該帳戶委派並未打開,因此通過將NTLM放在Kerberos之上的IIS屬性中,這些調用以及身份驗證都可以通過。 – spojam