HttpWebRequest不传递凭据

我试图使用HTTPWebRequest来访问REST服务,并且在传递证书时遇到问题,请参阅下面的代码。 我读过NetworkCredential不支持SSL,而且正在打HTTPS站点。 有没有人知道类似于支持SSL的NetworkCredential

 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(); 

如果你的服务器使用NTLM身份validation,你可以试试这个:

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

当你使用老式的方法时,看看它是否显示出来:

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

什么样的身份validation机制在保护Web服务? 在HttpWebRequest设置的凭据只能通过HTTP的Authorization头通过Basic , Digest或NTLM传递。 因此,如果您的Web服务受到WS-Security保护,则NetworkCredentials可能根本不会传递到身份validationscheme,因为WS-Security不会在HTTP级别上运行。

你应该做的是通过命令行工具wsdl.exe或类似的东西为Web服务创build一个Web服务客户端代理。 这将使您可以访问Web Serviceauthentication身份validationscheme。

更新后的评论:

看起来HttpWebRequest需要通过401 Unauthorized接收WWW-Authenticate挑战,才能通过SSL进行正确的authentication。 我想在HttpWebRequests有两个单独的代码path处理常规的HTTP通信和encryption的HTTPS通信。 无论如何,你应该尝试的是:

  1. 执行未经身份validation的HttpWebRequesthttps://.../ URI。
  2. 收到401 Unauthorized回复。
  3. 执行相同的请求,现在与两个Credentials集(不知道如果PreAuthenticate应该是truefalse ;testing两者)。
  4. 您现在应该可以获得200 OK或者您的Web Service响应的任何内容。

另一种select是在初始请求中自己构buildAuthorization头部:

 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); 

尝试设置request.PreAuthenticate为true。