NTLM v1身份验证仅适用于Fiddler2,而不是没有

时间:2011-11-07 17:52:27

标签: c# fiddler ntlm

我今天一直在解决这个问题。我一直在开发一个内部应用程序,它连续执行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();
}

2 个答案:

答案 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”

The full story

这只是一个黑暗的镜头,但这可能是服务器端的一个问题?阅读以下链接:http://support.microsoft.com/kb/813834

答案 1 :(得分:0)

我的解决方案是强制在服务器上使用64位NTLMv1。对我认识的每个人来说都不是解决方案,但它对我们有用。