5

我需要登录网站并执行操作。该网站基于 REST,因此我可以通过此操作轻松登录(登录信息作为查询字符串包含在 URL 中,因此我不需要设置凭据):

CookieContainer cookieJar = new CookieContainer();

HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl);
firstRequest.CookieContainer = cookieJar;
firstRequest.KeepAlive = true;
firstRequest.Method = "POST";
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse();

这有效并让我登录。我得到一个 cookie 来维护会话,它存储在上面显示的 cookieJar 中。然后我做了第二个请求,例如:

HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl);
secondRequest.Method = "POST";
secondRequest.KeepAlive = true;
secondRequest.CookieContainer = cookieJar;
WebResponse secondResponse = secondRequest.GetResponse();

我确保将 cookie 分配给新请求。但由于某种原因,这似乎不起作用。我收到一条错误消息,告诉我“我的会话已超时或过期”,这是一个接一个地完成的,所以这不是时间问题。

我使用 Fiddler 检查 HTTP 标头,但我发现这很困难,因为这是 HTTPS。(我知道我可以解密它,但似乎效果不佳。)

我可以为这个休息服务获取我的 URL 并将它们粘贴到 firefox 中,一切正常,所以它一定是我做错了,而不是连接的另一端。

我对 HTTPS 不是很熟悉。我需要做其他事情来维持我的会话吗?我认为cookie就是它,但也许我需要在两个请求中维护其他东西?

这是我发送第一个请求时返回的标头(除了我更改了 cookie 以保护无辜者!):

X-DB-Content-length=19
Keep-Alive=timeout=15, max=50
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html; charset=WINDOWS-1252
Date=Mon, 16 Nov 2009 15:26:34 GMT
Set-Cookie:MyCookie stuff goes here
Server=Oracle-Application-Server-10g

任何帮助将不胜感激,我已经没有想法了。

4

2 回答 2

4

在从我的程序中解密 HTTP 流量后,我终于让它工作了。

我回来的 cookie 没有列出 Path 变量。因此 .NET 采用当前路径并将其分配为 cookie 上的路径,包括当前页面。即:如果它位于http://mysite/somepath/somepage.htm,它将设置 cookie path=/somepath/somepage.htm。这是一个错误,因为它应该分配给“/”,这是所有 Web 浏览器所做的。(希望他们解决这个问题。)

注意到这一点后,我抓住了 cookie 并修改了 path 属性,现在一切正常。

遇到此类问题的其他任何人都可以查看 Fiddler。.NET 使用 Windows 证书存储,因此要从您的程序中解密 http 流量,您需要按照以下说明操作:http ://www.fiddler2.com/Fiddler/help/httpsdecryption.asp 。您还需要在 Fiddler 的 Options\HTTPS 选项卡下打开解密。

于 2009-11-16T17:09:22.983 回答
0

来自MSDN

当用户在安全区域和公共区域之间来回移动时,ASP.NET 生成的会话 cookie(或 URL,如果您启用了无 cookie 会话状态)以纯文本形式与它们一起移动,但身份验证 cookie 永远不会通过未加密的 HTTP 传递只要设置了 Secure cookie 属性,就可以连接。

所以基本上,如果“安全”属性设置为“假”,cookie 可以通过 HTTP 和 HTTPS 传递。

另请参阅如何在 http 和 https 之间共享 asp.net 会话

于 2009-11-16T15:19:23.110 回答