HttpWebRequest不传递凭据

时间:2009-11-09 17:16:54

标签: c# asp.net 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();

4 个答案:

答案 0 :(得分:48)

查看使用旧式方法时是否显示:

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

答案 1 :(得分:26)

哪种身份验证机制可以保护Web服务? HttpWebRequest上设置的凭据只能通过BasicDigestNTLM通过HTTP的Authorization标头传递。因此,如果您的Web服务受WS-Security保护,则NetworkCredentials可能根本不会传递给身份验证方案,因为WS-Security不在HTTP级别运行。< / p>

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

评论后更新:

似乎HttpWebRequest需要先通过WWW-Authenticate接收401 Unauthorized质询,然后才能通过SSL进行正确身份验证。我想HttpWebRequests中有两个独立的代码路径处理常规HTTP流量和加密的HTTPS流量。无论如何,你应该尝试的是:

  1. HttpWebRequest URI执行未经身份验证的https://.../
  2. 收到401 Unauthorized回复。
  3. 执行相同的请求,现在同时设置Credentials(不确定PreAuthenticatetrue还是false;同时测试两者)。
  4. 您现在应该获得200 OK或您的Web服务响应的任何内容。
  5. 另一个选择是在初始请求中自己构建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。