HttpWebRequest不传递凭据

Rus*_*ark 32 c# asp.net httpwebrequest

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

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();
Run Code Online (Sandbox Code Playgroud)

Ed *_*wer 48

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

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

  • 你能解释一下为什么这会起作用而不是 NetworkCredentials 吗? (3认同)

Asb*_*erg 26

什么样的身份验证机制保护Web服务?设置的凭据HttpWebRequest将仅Authorization通过Basic,DigestNTLM通过HTTP的标头传递.因此,如果您的Web服务受到保护WS-Security,NetworkCredentials则可能根本不会将其传递给身份验证方案,因为WS-Security它不在HTTP级别运行.

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

评论后更新:

在通过SSL进行正确身份验证之前,似乎HttpWebRequest需要接受WWW-Authenticate挑战401 Unauthorized.我想在HttpWebRequests处理常规HTTP流量和加密的HTTPS流量时有两个独立的代码路径.无论如何,你应该尝试的是:

  1. 执行未经HttpWebRequest身份验证的https://.../URI.
  2. 收到401 Unauthorized回复.
  3. 执行相同的请求,现在同时Credentials设置(不确定是否PreAuthenticate应该truefalse;测试两者).
  4. 您现在应该获得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);
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 21

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

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