OData服务的Windows身份验证在C#app中返回“401 - Unauthorized”,但在浏览器中有效

时间:2013-06-18 21:53:00

标签: c# http wcf-data-services windows-authentication ntlm

我正在尝试为我的C#app添加功能,以测试与仅使用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 - 未经授权的错误,如前所述。但是,当我运行Fiddler2时,代码运行正常。所以我使用的是Wireshark。此外,该服务在我的浏览器(Chrome)中运行良好,如果我使用Wireshark来比较身份验证的HTTP请求/响应,我发现它们几乎完全相同,只是在Chrome中我有:Accept,User-Agent ,Accept-Encoding和Accept-Language标头,而我的C#app没有这些。唯一的另一个区别是我的C#app在NTLM标题中设置了“Negotiate Seal”标志,而Chrome没有设置此标志。

尽管存在这些差异,但认证阶段似乎在C#应用程序中正常工作,直到服务返回302 - 重定向,此时应用程序在新重定向的URI上尝试GET,再次返回401(当Chrome执行类似的GET,它接收HTTP 200 - OK,然后以快乐的方式继续)。

那么,任何想法可能导致什么?服务有问题?还是我的代码?

非常感谢! -Erik

1 个答案:

答案 0 :(得分:0)

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