2012-04-20 121 views
1

在我的ASP.NET MVC 3應用程序中,當我在LogOn Action中檢查我的記住我框時,它應該創建一個持久性cookie,以便當我關閉瀏覽器並重新打開會話ID未被存儲在cookie中

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

當我使用小提琴手,我可以看到會話ID被送到像這樣:它,我應該還是會保持登錄

Request sent 342 bytes of Cookie data: 

ASP.NET_SessionId=<Session ID>; .ASPXAUTH=<Auth String> 

但是,當我關閉瀏覽器,重新打開它,我仍然登錄,但請求不發送會話ID:

Request sent 298 bytes of Cookie data: 

.ASPXAUTH=<Auth String> 

然後我把Response.Write(Session.SessionID)放在我的Action中,每當我重新打開我的瀏覽器時刷新頁面,這個就會改變。如果我不關閉瀏覽器,則每次刷新時會話ID保持不變。

我使用StateServer來保持會話狀態,因爲我認爲這可能會解決問題,因爲我也通過InProc來體驗它。

回答

3

這是預期的行爲。設置授權cookie的概念和會話的概念並不是一回事。只要用戶打開瀏覽器,ASP.NET中的會話就會生存,因爲會話存儲在每個會話cookie中。

」 ...... SessionID的值存儲在瀏覽器中的永久的session cookie的 (http://msdn.microsoft.com/en-us/library/ms178581.aspx)

持續存在會話是一個糟糕的主意,請記住,Sessions的正常情況是它們存儲在內存中,您是否真的想將用戶會話保存在未登錄的內存中在一個星期內?您試圖保存那麼長時間的任何類型的「會話」數據都不應該存儲在會話中,而是存儲在持久數據存儲區中(讀取:數據庫)

根據您的意見更新

我可能會建議你做這樣的事情:

public string GetMyCompany(){ 
    return Session["MyCompany"] = Session["MyCompany"] ?? GetMyCompanyFromDatabase(); 
} 
+0

右行,因爲我想在一個會話變量保存用戶的公司,因爲它是在用我的'_Layout.cshtml'文件和思想的Session變量會是最好的,因爲它在我的應用程序中的所有視圖中都是持久的,但似乎如果他們關閉瀏覽器,這個變量不再存在 – CallumVass 2012-04-20 13:52:49

+0

當然,非常有意義。但是,我建議你做這樣的事情: public string GetMyCompany(){ return Session [「MyCompany」] = Session [「MyCompany」] ?? GetMyCompanyFromDataBase(); } – aquinas 2012-04-20 13:56:56

+0

啊,完美我會試試看,謝謝! – CallumVass 2012-04-20 13:58:28