2012-03-21 100 views
4

我們使用.net framework 3.5和C#。.NET會話 - 持續會話,即使用戶關閉瀏覽器

我們有一個網站,需要用戶登錄。所以我們使用數據庫來檢查登錄名/密碼是否正確。

然後我們作出FormsAuthentication.SetAuthCookie()呼叫,所以用戶we''l在我的應用程序登錄。

,並在所有後續頁面,我們與User.Identity.IsAuthenticated()檢查,如果用戶登錄。

我們希望保留這個會話,即使在用戶關閉borwser。

如何最好的方法來做到這一點?

我們也有一個丟失會話的問題,突然用戶失去了他的身份驗證狀態,我認爲用這種新的堅持我們也可以解決這個問題。

(對不起,我的英語.....葡萄牙揚聲器)

回答

6

你不應該混合而言,記住,你必須在asp.net兩個身份驗證cookie和session狀態。

您似乎在尋找持久性驗證cookie。有一個持續的權威性的cookie盡力

FormsAuthentication.SetAuthCookie("xxx",true); 

http://msdn.microsoft.com/en-us/library/twk5762b(v=vs.90).aspx

傳遞true將允許驗證cookie生存的瀏覽器重新啓動。 你也應該考慮在你的web.config

<authentication mode="Forms"> 
     <!-- The name, protection, and path attributes must match 
     exactly in each Web.config file. --> 
     <forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" protection="All" path="/" timeout="360"/> 
    </authentication> 

<sessionState mode="InProc" timeout="360" /> 
1

我建議存儲會話信息的更簡潔的方法對窗體身份驗證和會話的超時值。 Shay堅持認證cookie的方法當然是正確,但是將sessionState長時間存儲在進程中會在將應用程序擴展到多個併發用戶時存在嚴重的缺陷。

首先,爲了澄清,會話狀態意味着任何可以通過Session[]集合訪問的任何內容。

一個更好的技術,我已經看到一家大銀行成功使用*,是將永久會話相關信息存儲在數據庫中。

基本上你需要

  1. 表是primaryforeign鍵連接到的用戶ID,和a)一樣多的列需要存儲變量或b)包含序列值的一個單一的BLOB列類
  2. A PersistentSession
  3. 在Global中填充該對象。ASAX Session_Start或更好的Application_PostAuthenticateRequest方法,並將其保存在Session對象
  4. 保存從Session到數據庫中的對象的Global.asax Session_End方法

如果選擇B方法只是序列化/反序列化對象,你得到它!

* SAVESESSION被這些傢伙使用的真正方式是完全不同的

相關問題