我今天一直在解决这个问题。我一直在开发一个内部应用程序,它连续执行HTTP GET和POST以填充一系列Web表单。当我运行fiddler2时,代码工作正常 - 我用来调试我的GET URI和POST FormData的工具。现在我没有运行fiddler2我收到了身份验证401错误。我会看一下比较的标题,但是如果没有能够运行fiddler那就有点难了。
基本上我的代码通过访问URI并存储cookie来工作。访问该站点由SSO控制,并且当服务器在2003运行时,它想要使用NTLMv1。我对Windows 7客户端的第一个问题是Win7会协商128位,而服务器只会说64位,身份验证会失败(最终401)。使用fiddler2并将本地计算机上的组策略设置为64位,然后我就可以完成我的工作了。然后我把软件变成了一个网络服务,今天发现有一个问题就是失败了。正如我之前所说的那样,fiddler2运行时一切正常,让我有点漏洞,因为我无法安装每个客户端并使用fiddler2来获取我的功能!
首先,我有我的功能来存储cookie ....然后我有另一个使用该cookie执行get的函数,第一个函数总是失败,“远程服务器返回错误:(401)未经授权。”
我希望在某个地方我错过了一些显而易见的东西,而我并没有尝试做一些不可能的事情。
谢谢, 人
/// <summary>
/// Function to get a cookie from a site providing the given site and credentials - this cookie then can be reused for subsequent calls
/// </summary>
/// <param name="credential">The NetworkCredential to access the site</param>
/// <param name="Uri">The Uri of the site</param>
/// <returns>A CookieContainer containing all needed cookies</returns>
private CookieContainer GetCookie(NetworkCredential credential, string Uri)
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Uri);
HttpWebResponse resp;
CookieContainer cookieJar = new CookieContainer();
req.AllowAutoRedirect = true;
req.Credentials = credential;
req.CookieContainer = cookieJar;
resp = (HttpWebResponse)req.GetResponse(); // This line always fails with: The remote server returned an error: (401) Unauthorized.
return cookieJar;
}
/// <summary>
/// Function to perform a HTTP GET
/// </summary>
/// <param name="cookieJar">A CookieContainer for keeping the reference of our sessions</param>
/// <param name="credential">The Credentials to use to access the site</param>
/// <param name="Uri">The Uri to GET</param>
private void DoGet(CookieContainer cookieJar, NetworkCredential credential, string Uri)
{
HttpWebRequest req;
HttpWebResponse resp;
// Just grab the site uri where the cookie is stored
string[] UriParts = Uri.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
Uri CookieUri = new Uri(UriParts[0] + "//" + UriParts[1]);
// Use cookie information to get first page of call entry
req = (HttpWebRequest)HttpWebRequest.Create(Uri);
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(cookieJar.GetCookies(CookieUri)[0]);
req.AllowAutoRedirect = true;
req.Credentials = credential;
req.CookieContainer = cookieJar;
resp = (HttpWebResponse)req.GetResponse();
}
答案 0 :(得分:1)
我还不知道答案,但我遇到了同样的问题,尽管有一点不同。如果没有fiddler2运行,我也有一个失败的过程,就像一个冠军一样。首先,我们有一个调度程序应用程序,它连接到各种Web服务并将原始Soap消息发送到各种Web服务,然后接收响应并将它们传递回数据库。对于一些服务而且现在已经过了很长一段时间,顺便说一下,这些都是外部服务,这个过程一直在运行,而不是一点点。但是,当我们介绍一个恰好在内部开发的Web服务时,我开始遇到完全相同的问题。
我首先怀疑的是,作为代理的提琴手以某种方式解决了凭据问题。这可能是也可能不是,但它似乎是一个好的起点。首先,我到目前为止测试了两个:
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
和
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
没有决心。另外,我用过
webRequest.Credentials = CredentialCache.DefaultCredentials;
和
webRequest.Credentials = CredentialCache.DefaultNetworkCredentials;
再次,没有决心。我确实相信你正在使用NTLMv1,我想我们可能需要的是以某种方式为NTLMv1身份验证/授权颁发凭证。
微软网站指出: authType支持的值是“NTLM”,“Digest”,“Kerberos”和“Negotiate”
这只是一个黑暗的镜头,但这可能是服务器端的一个问题?阅读以下链接:http://support.microsoft.com/kb/813834
答案 1 :(得分:0)
我的解决方案是强制在服务器上使用64位NTLMv1。对我认识的每个人来说都不是解决方案,但它对我们有用。