具有重定向功能的经过身份验证的HttpWebRequest,如何保留凭据?

7

我的 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未经授权的错误返回,似乎是在第一个重定向代码(301 Moved)被返回后,在我的请求对象尝试跟随重定向时发生的。

因此,基本上,有人知道跟随重定向的经过身份验证的HttpWebRequests是否存在任何问题吗?

PS - 显而易见的解决方法是简单地请求被重定向到的页面,但是负责intranet网站的管理员希望通过将我重定向到特定页面来监视我的应用程序的使用情况。


你是否观察过网络流量(例如使用Fiddler),以查看客户端是否尝试对重定向的最终目标进行任何客户端身份验证?自动认证到重定向服务器失败可能是.NET内部的安全措施,以防止意外凭据泄露。 - EricLaw
我遇到了同样的问题,仍然无法找出问题所在。 - Hemanshu Bhojak
3个回答

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

这将取决于您的身份验证方案如何工作。网络凭据仅对NTLM部分有帮助。我怀疑您尝试访问的站点也使用表单身份验证。如果是这种情况,当您登录时,应该会收到一个身份验证cookie,您需要在随后的请求中包含它,例如在重定向后。我认为WebRequest对象具有头集合,您可以使用它来保存cookie。最好使用Fiddler或Firebug查看正常浏览时传输了什么。


-1

如果您正在使用NTLM,则会出现经典的两次跳转问题。在您的开发机器上可以正常工作,因为客户端和服务器在同一台机器上,并且凭据最多只传递一次(我猜是传递到重定向的最终目标机器)

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


谢谢Tion,但我不认为这是问题所在 - 凭据对象是针对与登录到我的应用程序的用户不同的帐户,因此只涉及一个跳跃 - 我真的应该提到这一点 :)问题似乎在于从服务器获取响应时涉及透明重定向,如果我指定最终URL而不是重定向的URL,则所有内容都可以正常工作... - Phil Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接