C#在客户端上通过HTTPS维护会话

时间:2009-11-16 15:15:17

标签: c# https webrequest

我需要登录网站并执行操作。该网站基于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

任何帮助都会受到赞赏,我的想法已经不多了。

2 个答案:

答案 0 :(得分:4)

我在解密来自我程序的HTTP流量后终于开始工作了。

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

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

任何有这样问题的人都会查看Fiddler。 .NET使用Windows证书存储区来解密来自您的程序的http流量,您需要按照此处的说明进行操作:http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp。您还需要在Fiddler的Options \ HTTPS选项卡下打开解密。

答案 1 :(得分:0)

来自MSDN

  

当用户在安全区域和公共区域之间来回移动时,ASP.NET生成的会话cookie(如果您启用了无cookie会话状态,则为URL)以明文移动,但是身份验证cookie永远不会通过通过未加密的HTTP连接 ,只要设置了安全cookie属性

基本上,如果'Secure'属性设置为'false',则可以通过HTTP和HTTPS传递cookie。

另见how can I share an asp.net session between http and https