经过身份验证的HttpWebRequest重定向,持久化凭据?

时间:2009-05-29 14:36:36

标签: asp.net authentication

我的ASP.NET 2.0应用程序为公司内部网中的站点创建HTTPWebRequest,该站点使用NTLM身份验证。传递的凭据是针对服务帐户的,该帐户在域上成功进行了身份验证(安全日志确认了这一点)

一些缩写代码如下......

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username,
                pwd, domain); 
req.Credentials = cred;

HttpWebResponse response = req.GetResponse() as HttpWebResponse;

作为请求的一部分,有一些重定向(在同一个域内)到最终响应 - 在我的开发机器上处理正常(Windows 2k)

当从我的部署环境(Windows 2k3)创建此请求时,我从站点返回401 Unauthorized错误,似乎在返回第一个重定向代码(301 Moved)之后,我的请求对象尝试遵循重定向

所以基本上,有没有人知道围绕重定向的经过身份验证的HttpWebRequests的任何问题?

PS - 明显的解决方法是简单地请求重定向到的页面 - 但负责内部网站点的管理员希望通过重定向我通过特定页面来监控我的应用程序的使用情况。

3 个答案:

答案 0 :(得分:12)

要使HttpWebRequest跨重定向重用凭据,您需要使用凭据缓存。 如果您只是分配一个NetworkCredentials对象,它将仅用于第一个请求。

以下是一个例子:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}};
req.Credentials = cache;
HttpWebResponse response = req.GetResponse() as HttpWebResponse;

答案 1 :(得分:1)

这将取决于你的身份验证。计划工作。网络凭据只会帮助NT的NTLM部分。我怀疑您尝试访问的网站也在使用表单身份验证。如果是这种情况,当您登录时应该获得一个身份验证cookie,您需要在后续请求中包含该cookie,例如:重定向后。我认为WebRequest对象有一个标题集合,可用于保存cookie。使用提琴手或萤火虫来看看正常浏览时会发生什么,这可能是个好主意。

答案 2 :(得分:-1)

如果您使用的是NTLM,这是经典的2跳问题。它适用于你的开发机器,因为客户端和服务器在同一个盒子上,并且凭证最多传递一次(到我猜的重定向最终目标机器)

部署到prod环境时,涉及3台计算机。客户端浏览器将凭据传递给server1,然后server1尝试将凭据传递给server2,这是不允许的。一个解决方法是实现Kerberos身份验证(更严格的协议),这将允许server1将凭据传递给server2