OData服务返回“401 -未授权”的Windows身份验证;在c#应用程序中,但在浏览器中工作
本文关键字:应用程序 工作 浏览器 身份验证 Windows 返回 服务 授权 OData | 更新日期: 2023-09-27 18:18:53
我正试图为我的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 -未经授权的错误,如前所述。然而,当我让Fiddler2运行时,代码工作得很好。所以我用Wireshark代替。此外,该服务在我的浏览器(Chrome)中工作完美,如果我使用Wireshark来比较身份验证的HTTP请求/响应,我看到它们几乎相同,除了在Chrome中我有:Accept, User-Agent, Accept- encoding和Accept- language标头,而我的c#应用程序没有这些。唯一的其他区别是,我的c#应用程序在NTLM标头中设置了"协商密封"标志,而Chrome不设置此标志。
尽管存在这些差异,认证阶段似乎在c#应用程序中工作得很好,直到服务返回302 -重定向,此时应用程序在新重定向的URI上尝试GET,再次返回401(当Chrome执行类似的GET时,它接收到HTTP 200 - OK,并继续其愉快的方式)。
那么,你知道是什么原因导致的吗?服务有问题吗?还是我的代码?
非常感谢!erik
好吧,整整两天的研究,我找到了答案。上面代码中的第3行使用了服务的完整URI("…/Northwind/Northwind.svc"),当请求被重定向时,凭证不再应用于新的URI。解决方案是只传入URI的开头部分("…")。这是我的一个愚蠢的错误。