首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有重定向、持久化凭证的经过身份验证的HttpWebRequest?

具有重定向、持久化凭证的经过身份验证的HttpWebRequest?
EN

Stack Overflow用户
提问于 2009-05-29 14:36:36
回答 3查看 9.3K关注 0票数 7

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

以下是一些缩写代码。

代码语言:javascript
运行
复制
HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username,
                pwd, domain); 
req.Credentials = cred;

HttpWebResponse response = req.GetResponse() as HttpWebResponse;

作为请求的一部分,对最终响应有两个重定向(在相同的域中)--在我的dev机器(Windows2k)上处理OK。

当从我的部署环境(Windows 2k3)创建此请求时,我从站点返回一个401个未经授权的错误,似乎是在返回第一个重定向代码(301被移动)之后,并且请求对象试图遵循重定向。

因此,基本上,是否有人知道围绕经过身份验证的HttpWebRequests遵循重定向的问题?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-22 02:53:32

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

下面是一个示例:

代码语言:javascript
运行
复制
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;
票数 12
EN

Stack Overflow用户

发布于 2009-05-29 15:05:09

这要看你怎么做了。计划奏效了。网络凭据只会帮助if的NTLM部分。我怀疑您试图访问的站点也在使用窗体身份验证。如果是这样的话,当您登录时应该得到一个auth cookie,您将需要将它包含在后续的请求中,例如在重定向之后。我认为WebRequest对象有一个headers集合,您可以使用它来保存cookie。也许是一个好主意,使用小提琴或萤火虫,看看什么是遇到的时候,你通常浏览。

票数 1
EN

Stack Overflow用户

发布于 2009-05-29 15:16:21

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/926309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档