2009-11-16 53 views
5

我需要登录到网站并执行操作。该网站是基于REST的,所以我可以做这个很容易登录(登录信息是作为在URL查询字符串,所以我dont't需要设置凭证):C#通过客户端上的HTTPS维护会话

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分配给新的请求。但由于某种原因,这似乎不起作用。我收到一个错误,告诉我“我的会话超时或过期”,并且这是一个接一个地完成的,所以它不是时间问题。

我使用提琴手检查HTTP标头,但我发现,因为这很难是HTTPS。 (我知道我可以解密它,但似乎不工作。)

我可以把我的网址的这个休息服务,并将它们粘贴到Firefox中,它一切正常,所以它必须是我在做的事情错误而不是连接的另一端。

我对HTTPS不是很熟悉。我需要做其他事情来维持我的会话吗?我认为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

我终于得到它从我的程序解密HTTP流量后的工作。

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

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

任何其他人都有这样的问题检查出提琴手。 。NET使用Windows证书存储以便从您的程序中解密http流量,您需要按照此处的说明操作:http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp。您还需要在Fiddler的Options \ HTTPS选项卡下打开解密。

+0

微软似乎已经在.NET 4中修复了这个问题。 – Kelly 2010-06-28 22:02:41

+0

您好凯利,我也面临一些会话过期,可能与您的情况类似,请您看看这个链接:http://stackoverflow.com/问题/ 22957840/crawling-session-expired谢谢 – bluewonder 2014-04-09 09:19:20

0

MSDN

当用户(如果启用了cookie的会话状态或URL)的安全和公共场所时,ASP.NET生成会话cookie之间来回移动,以将它们移动明文,但身份验证cookie不会通过未加密的HTTP连接过去了,只要安全cookie属性设置

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

也看到how can I share an asp.net session between http and https

+0

不知道我明白。我在客户端,而不是这个请求的服务器端。我需要维护跨服务器的两个或更多调用的会话,但即使我将cookie一起使用,它似乎也不会识别我正在使用同一个会话。 – Kelly 2009-11-16 15:38:40

+0

他假设你正在与之交谈的网站是基于ASP.Net的,他有点困惑,但不管他的建议是将第一次调用安全属性后的cookie设置为true,然后看看它是否有效(我认为) – John 2009-11-16 16:18:59

+0

我试了一下。 cookies返回为secure = false。我为第二个请求设置了它们,但仍然没有运气。 – Kelly 2009-11-16 16:32:42