1

我正在尝试向我的 C# 应用程序添加功能,以测试与仅通过 Windows 身份验证保护的 OData 服务的连接。以下代码块是我用来执行此测试的代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME));
CredentialCache myCache = new CredentialCache();

myCache.Add(new Uri(SERVICE_NAME), "Negotiate", new NetworkCredential(user, password));
resolver.Credentials = myCache;

//  Do a simple request
request.Credentials = myCache;
request.PreAuthenticate = true;
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.CookieContainer = new CookieContainer();
object response = request.GetResponse();  // This is where the exception is thrown

当我运行上述代码时,我收到 401 - Unauthorized 错误,如前所述。但是,当我运行 Fiddler2 时,代码可以正常工作。所以我改用 Wireshark。此外,该服务在我的浏览器 (Chrome) 中运行完美,如果我使用 Wireshark 比较身份验证的 HTTP 请求/响应,我发现它们几乎相同,除了在 Chrome 中我有:Accept, User-Agent 、Accept-Encoding 和 Accept-Language 标头,而我的 C# 应用程序没有这些标头。唯一的另一个区别是我的 C# 应用程序在 NTLM 标头中设置了“协商印章”标志,而 Chrome 没有设置此标志。

尽管存在这些差异,但身份验证阶段似乎在 C# 应用程序中运行良好,直到服务返回 302 - 重定向,此时应用程序尝试对新重定向的 URI 进行 GET,该 URI 再次返回 401(当 Chrome 执行类似的 GET,它接收 HTTP 200 - OK,然后继续愉快地进行)。

那么,有什么想法可能导致这种情况吗?服务有问题?还是我的代码?

非常感谢!-埃里克

4

1 回答 1

0

好的,整整两天的研究,我找到了答案。上面代码中的第 3 行使用了服务的完整 URI(“.../Northwind/Northwind.svc”),当请求被重定向时,凭据不再应用于新的 URI。解决方案是只传入 URI 的开始部分(“...”)。我犯了愚蠢的错误。

于 2013-06-19T16:46:01.880 回答