2009-11-09 75 views
31

我试图用HTTPWebRequest访问REST服务时遇到路过的凭据,请参阅下面的代码问题。我读过NetworkCredential不支持SSL,而且我打了一个HTTPS网站。有谁知道类似于支持SSL的NetworkCredentialHttpWebRequest的不及格证书

Uri requestUri = null; 
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri); 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
NetworkCredential nc = new NetworkCredential("user", "password"); 
request.Credentials = nc; 
request.Method = WebRequestMethods.Http.Get; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

回答

20

如果您的服务器使用NTLM身份验证,你可以尝试这样的:

CredentialCache cc = new CredentialCache(); 
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password")); 
request.Credentials = cc; 
+0

这工作了我,谢谢。 – 2009-12-07 21:42:40

3

尝试设置request.PreAuthenticate为true。

+1

根据[这](http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like)将无法正常工作。仍然需要一些工作 – chaZm 2014-06-03 06:56:57

25

什么样的认证机制所保护的Web服务?在HttpWebRequest设置凭据只能通过HTTP的Authorization头通过BasicDigestNTLM传递。所以,如果您的Web服务与WS-Security保护,该NetworkCredentials可能不会被转嫁到认证方案可言,因为WS-Security不会在HTTP级别上操作。

你应该做的是通过命令行工具wsdl.exe或类似的东西创建Web服务的Web服务客户端代理。这将使您可以访问Web Service认证身份验证方案。评论后

更新:

好像HttpWebRequest需要接收WWW-Authenticate挑战与401 Unauthorized,才可以通过SSL正确验证。我猜想HttpWebRequests中有两个单独的代码路径,用于处理常规HTTP流量和加密的HTTPS流量。无论如何,你应该尝试一下,就是:

  1. 执行未经认证的HttpWebRequesthttps://.../ URI。
  2. 收到401 Unauthorized响应。
  3. Credentials组执行相同的请求,现在(不知道PreAuthenticate应该是truefalse;测试两个)。
  4. 您现在应该得到200 OK或者您的Web Service响应的任何内容。

另一种选择是自己建立在初始请求的Authorization头:

string credentials = String.Format("{0}:{1}", username, password); 
byte[] bytes = Encoding.ASCII.GetBytes(credentials); 
string base64 = Convert.ToBase64String(bytes); 
string authorization = String.Concat("Basic ", base64); 
request.Headers.Add("Authorization", authorization); 
+0

对不起,我直到现在才意识到它是我打电话的REST服务,所以现在有了wsdl文件。另外,我能够在调试器中执行代码,并且可以看到它正确地生成了NetworkCredentials对象,但它似乎并没有被传入HttpWebRequest。还有一件事 - 我可以通过在浏览器地址栏中输入REST服务来成功地调用REST服务,所以它必须以这种方式使用我的凭证。 – 2009-11-09 19:01:29

+1

您尚未编写您正在使用的认证方案以及您从哪里获取凭证。另外,如果这是一个REST服务,它不应该有一个WSDL文件。带有WSDL文件的Web服务通常是一个SOAP Web服务,它与REST Web服务直接相反。 如果能够通过浏览器访问Web服务(没有任何凭据打字?)听起来像它与HTTP认证保护,可能NTLM。这是真的? – 2009-11-10 07:48:48

+0

另外,你得到的回应是什么?它是“401未授权”,“403禁止”还是其他? – 2009-11-10 07:52:39

48

看它是否出现在你使用老式的方法:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password")); 
request.Headers.Add("Authorization", "Basic " + credentials); 
+0

这只是为我工作。 – ryancammer 2010-07-30 23:57:27

+0

也为我工作。 – SouthShoreAK 2012-04-13 21:01:18

+0

解决了我的问题。由于其简洁而得到赞扬。 – Skitterm 2012-08-10 17:08:39