2011-12-29 56 views
5

我有一個頁面,用戶通過Web服務登錄到後端應用程序。 Web服務返回一個會話ID,我想要在cookie中存儲40分鐘,因爲後端應用程序在40分鐘後自動關閉會話。C#Cookie - 過期屬性不會設置

我的代碼寫的cookie:

private void SetCookie() 
{ 
    Response.Cookies.Add(new HttpCookie("Cookie_SessionID")); 
    Response.Cookies["Cookie_SessionID"].Value = ni.NicheSessionID; 
    Response.Cookies["Cookie_SessionID"].Expires = DateTime.Now.AddMinutes(40); 

    //.... after a few more things 
    Response.Redirect(returnUrl); 
} 

然後接收頁上我有這樣的:

private HttpCookie GetCookie() 
{ 
    HttpCookie cookie = Request.Cookies["Cookie_SessionID"]; 
    if (cookie != null && cookie.Value != null) 
    {    
     return cookie; 
    } 
    return null;   
} 

出於某種原因,由GetCookie()返回的cookie的總有0001-01-01 00:00:00Expires值,即使當我在瀏覽器中查看Cookie時,它也具有正確的到期時間。

看了this其中規定過期的餅乾根本就沒有發送到服務器,我認爲有什麼可以發生的是,該cookie正在正確寫入但瀏覽器不發送到期日,因爲它實際上是不必要的?...

我的問題是,我想精確捕獲 - 該cookie已'過期',因此他們必須再次登錄 - 但我需要顯示一條消息,沿着「我知道你有已經登錄,但你需要再次做「類型的事情。

謝謝

回答

10

除了cookie名稱和值之外,瀏覽器不會向服務器發送任何內容。所有其他屬性(過期,域名,路徑,httponly,...)都不能在設置cookie後根據請求進行檢索。

如果要顯示此類消息,則需要其他一些檢測用戶是否已登錄的機制。您可以設置一年左右的狀態Cookie並檢查它是否存在。

解決這個問題的更可接受的方式是,當用戶嘗試訪問受保護的資源時,將用戶重定向到登錄頁面,並沿着「您需要登錄才能查看此頁面」一行顯示一些消息。之前登錄過,您的會話可能已過期。「

(也請注意,您應該在每次請求時重新設置Cookie,以便用戶在繼續使用該網站時不會被註銷。從代碼中不清楚您是否正在執行此操作)

3

HTTP協議不會將cookie過期日期發送到服務器。