我正在尝试使用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();
答案 0 :(得分:48)
查看使用旧式方法时是否显示:
string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
答案 1 :(得分:26)
哪种身份验证机制可以保护Web服务? HttpWebRequest
上设置的凭据只能通过Basic,Digest或NTLM通过HTTP的Authorization
标头传递。因此,如果您的Web服务受WS-Security
保护,则NetworkCredentials
可能根本不会传递给身份验证方案,因为WS-Security
不在HTTP级别运行。< / p>
您应该做的是通过命令行工具wsdl.exe
或类似的东西为Web服务创建Web服务客户端代理。这将使您可以访问Web服务感知的身份验证方案。
评论后更新:
似乎HttpWebRequest
需要先通过WWW-Authenticate
接收401 Unauthorized
质询,然后才能通过SSL进行正确身份验证。我想HttpWebRequests
中有两个独立的代码路径处理常规HTTP流量和加密的HTTPS流量。无论如何,你应该尝试的是:
HttpWebRequest
URI执行未经身份验证的https://.../
。401 Unauthorized
回复。Credentials
(不确定PreAuthenticate
是true
还是false
;同时测试两者)。200 OK
或您的Web服务响应的任何内容。另一个选择是在初始请求中自己构建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);
答案 2 :(得分:21)
如果您的服务器使用NTLM身份验证,您可以尝试:
CredentialCache cc = new CredentialCache();
cc.Add(
new Uri("https://mywebserver/webpage"),
"NTLM",
new NetworkCredential("user", "password"));
request.Credentials = cc;
答案 3 :(得分:3)
尝试将request.PreAuthenticate设置为true。