2013-04-04 68 views
2

我需要以編程方式從SharePoint服務器下載文件。HTTP上的NTLM:任何C#客戶端實現?

當我下載的文件與Firefox它看起來像一個單一的請求,但Httpfox表明HTTPS會話實際上是4個請求:

REQ1: GET https://mycorp.raxsp.com/_windows/default.aspx?ReturnUrl=/personal/mycorp_user1/_vti_bin/cmis/rest?getRepositories 
RESP1: 401 Unauthorized, WWW-Authenticate NTLM 

REQ2: Authorization NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA= 
RESP2: 401, WWW-Authenticate NTLM TlRMTVNTUAACAAAACgAKADgAAAAFgokC+[...] 

REQ3: Authorization NTLM TlRMTVNTUAADAAAAGAAYAIAAAAAYA[...] 
RESP3: 302 Found, Set-Cookie FedAuth=77u/PD94bW[...], Location /personal/mycorp_user1/_vti_bin/cmis/rest?getRepositories 

REQ4: GET /personal/mycorp_user1/_vti_bin/cmis/rest?getRepositories 
RESP4: 200 OK, <download begins> 

我嘗試下載一個簡單的HttpWebRequest與用戶的文件/密碼,但如預期我只是得到錯誤401.我正在考慮實施全4名的請求,計算與NTLM over HTTP authentication algorithmspec)的挑戰,但聽起來很容易出錯...

是否有一個客戶端庫或代碼片斷通過HTTP身份驗證執行NTLM的寵物?
這是an Open Source project,所以必須是開源的,最好使用HttpWebRequest
沒有涉及Kerberos/SSO /域。

+0

可能重複的代碼(http://stackoverflow.com/questions [System.Net.WebClient不使用Windows身份驗證工作]/1030177/system-net-webclient-doesnt-work-with-windows-authentication) – gilly3 2013-04-04 04:19:44

+0

@ gilly3:這是一個不同的問題:1)IE8沒有問題2)該問題的用戶名「boxname \ peter」表示域名是參與其中。我的用戶名不包含\。 3)問題說「客戶端和IIS都在同一個Windows上」,這不是我的情況。 4)接受的解決方案是「輸入本地計算機上的站點的主機名」。本地計算機上有** no **站點。當客戶端和服務器都在同一臺機器上時,會發生這種問題,這不是我的情況。 – 2013-04-04 05:12:46

+0

正如我從請求中看到的,它們如下所示:Authenticate,Set-Cookie,Redirect,下載具有cooke集的文檔。當您僅使用HttpWebRequest時,它可能會對您的請求進行身份驗證,但不會要求使用身份驗證發送客戶端cookie的文檔。所以我認爲NTLM在這裏可以,而其餘的不起作用 – Lanorkin 2013-04-04 10:12:47

回答

1

我們從SharePoint下載文件所有的時間用的System.Net.WebClient

public static byte [] downloadSharepointFile (string url){ 
     using (var client = new WebClient { Credentials = new NetworkCredential("username", "password", "domain") }) 
      { 
       client.Headers.Add("Accept: application/json"); 
       return client.DownloadData(url); 
      } 
} 
+0

這對NTLM真的有用嗎? – 2015-09-04 03:56:11

+0

它適用於我的。如果它不適合你讓我知道,我們可以比較項目設置 – Aaron 2015-09-04 15:18:03