奇怪的HTTP认证问题

本文关键字:认证 问题 HTTP | 更新日期: 2023-09-27 18:07:53

我在尝试使用摘要身份验证与web服务器(Apache 2.2.17)通信时遇到问题,并使用POST方法发送数据:它总是返回401错误。然而,它工作得很好,当我们不发布数据,或者当Fiddler正在运行(即使在发布数据)…你知道是什么导致了这个问题吗?

public void DoRequest(string v_strURL, XmlDocument v_objXMLDoc)
{
var credentialCache = new CredentialCache();
credentialCache.Add(new Uri("http://" + ServerIP + "/"), "Digest", new NetworkCredential("admin", "test", "realm"));
String RequestContent = "request=" + v_objXMLDoc.InnerXml.Replace(' ', '+');
Uri Url = new Uri(v_strURL);
HttpWebRequest objHttpWebRequest;
HttpWebResponse objHttpWebResponse = null;
Stream objRequestStream = null;
byte[] bytes = new byte[0];
bytes = System.Text.Encoding.UTF8.GetBytes(RequestContent);
objHttpWebRequest = (HttpWebRequest)WebRequest.Create(v_strURL);
objHttpWebRequest.UserAgent = "MySampleCode";
objHttpWebRequest.Credentials = credentialCache;
objHttpWebRequest.Method = "POST";
objHttpWebRequest.ContentLength = bytes.Length;
objHttpWebRequest.ContentType = "text/xml; encoding='utf-8'";
objHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
objRequestStream = objHttpWebRequest.GetRequestStream();
objRequestStream.Write(bytes, 0, bytes.Length);
objRequestStream.Close();
objHttpWebResponse = (HttpWebResponse)objHttpWebRequest.GetResponse();
}

奇怪的HTTP认证问题

设置两次Content-Type header的原因是什么?它不太可能达到你想要的效果。另外,为什么要将信用记录与服务器IP而不是主机名一起放在缓存中呢?

HTTP/401提示服务器正在挑战客户端凭据。期望客户端通过重新提交带有附加凭据的请求来响应。一个关键问题是,在失败的情况下,客户端是试图发送凭据而被拒绝,还是根本不尝试发送凭据?

如果Fiddler"神奇地"为你解决了问题,你可能应该使用Netmon或Wireshark进行低级检查。

您的HttpWebRequest.Create()调用(即v_strUrl)的主机名与调用credentialCache.Add()(即ServerIP)的主机名相同吗?如果没有,那么这将总是失败。

不使用CredentialCache,直接将凭据添加到HttpWebRequest对象

请求。凭据= new NetworkCredential("user", "password", "realm");

,看看是否可以

我们终于解决了这个问题:

objHttpWebRequest.ServicePoint.Expect100Continue = false;