2013-04-04 64 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