2009-11-16 84 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