NTLM v1身份验证只适用于Fiddler2
本文关键字:适用于 Fiddler2 身份验证 v1 NTLM | 更新日期: 2023-09-27 18:13:57
我今天一直为这个问题烦恼。我一直在开发一个内部应用程序,它可以连续使用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();
}
我还不知道答案,但我也遇到了同样的问题,尽管有一些不同。我也有一个过程,如果没有小提琴手的运行,就会失败,就像一个冠军。首先,我们有一个调度程序应用程序,它连接到各种web服务并向其发送原始Soap消息,然后接收响应并将其传递回数据库。对于几个服务,在很长一段时间内,顺便说一下,这些都是外部服务,这个过程一直在运行,没有出现太多的故障。然而,当我们引入一个恰好是内部开发的web服务时,我开始遇到完全相同的问题。
我首先怀疑的是fiddler,作为代理,以某种方式解决了凭据问题。这可能是,也可能不是,但这似乎是一个很好的开始。首先,到目前为止,我已经用两种方法进行了测试:
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"answers"Negotiate"
全文
这只是一个黑暗的镜头,但这可能是一个问题与服务器端?阅读以下链接:http://support.microsoft.com/kb/813834
我的解决方案是在服务器上强制使用64位的NTLMv1。并不是每个人都能解决这个问题,但它适合我们。