2013-07-23 106 views
3

有沒有一種方法可以在用戶關閉瀏覽器並重新打開後保留瀏覽器會話。Asp.Net:關閉並重新打開瀏覽器實例後保留舊的瀏覽器會話

asp.Net中的默認行爲是當瀏覽器關閉瀏覽器時,它保留瀏覽器Cookie中的Asp.Net SessionId,其中到期。在重新打開瀏覽器asp.net生成一個新的SessionId,即使舊的會話沒有在服務器端過期,我們不能保留它。

我們可以在Asp.Net中控制會話cookie到期行爲嗎?

+0

如果您設置了cookie的到期日期,不能解決您的問題? e.x .:'Response.Cookies [「userName」]。Value =「test」; Response.Cookies [「userName」]。Expires = DateTime.Now.AddDays(1);' –

回答

4

您不能像這樣回收session-id,但您當然可以恢復會話狀態的某些可預測部分。如果您使用表單身份驗證,則只需閱讀global.asaxsession start中的forms-auth cookie並重新填充會話對象。

您可以使用手動創建一個永久性的Cookie控制Forms身份驗證Cookie的過期:

Dim authCookie As HttpCookie = FormsAuthentication.GetAuthCookie(userName) 
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value) 
Dim newAuthTicket As New FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, expireDate, authTicket.IsPersistent, userData) 
authCookie.Value = FormsAuthentication.Encrypt(newAuthTicket) 
authCookie.Expires = newAuthTicket.Expiration 
HttpContext.Current.Response.Cookies.Set(authCookie) 

FormsAuthentication.SetAuthCookie(userName, true) 

或者,您也可以手動更改cookie的微調到期

其中expireDate指定cookie何時應該過期。現在

global.asaxsession start您可以檢查是否返回用戶通過身份認證(由於先前設置永久性Cookie的):

If HttpContext.Current.User.Identity.IsAuthenticated Then 
    ' Here re-populate the predictable part of session state 
    ' Like user profile etc. 
End If 

添加後運見解

Forms身份驗證是不是正在使用,目的是能夠恢復前一屆會議。

在這種情況下,唯一的選擇是通過持久性Cookie來堅持現有會話,以便您稍後可以檢索它。有一些解決方法可以實現這一點。其中一個解決方法是通過這個博客作家在這裏解釋:

http://weblogs.asp.net/imranbaloch/archive/2010/06/09/persisting-session-between-different-browser-instances.aspx

這裏發生的事情是,我們截取的global.asax兩個事件:

  1. PostRequestHandlerExecute:(發生在ASP的時候。 NET事件處理程序完成執行)在這個處理程序中,我們創建一個新的cookie(例如temp),其值被賦予當前SessionId的值。通過將expires屬性設置爲會話超時,我們將其設置爲持久cookie。

  2. PostMapRequestHandler:在此處理程序(在ASP.NET映射了當前請求到相應的事件處理程序發生),我們通過檢查「臨時」 cookie的存在檢查回訪用戶。如果找到,我們更新實際會話cookie(ASP.NET_SessionId),其值爲我們的「temp」cookie;從而有效恢復前一屆會議。

請注意,這只是一種解決方法。該系統旨在創建一個新的會話。我們所做的只是使用幾個鉤子來解決這個問題,方法是持久化現有會話以便稍後檢索它。所有的安全影響都是成立

+0

我的應用程序不使用任何身份驗證。 – Amitabh

+0

在這種情況下,您只需使用用戶標識/名稱保存簡單的httpcookie(而不是修改forms-auth cookie),並且將來會過期。在'global.asax'中讀取它並重新加載會話對象。 – Abhitalks

+0

它不是關於重新安排會話,而是關於重新打開瀏覽器時保留舊會話。 – Amitabh

2

至少您可以檢索會話信息。當您將'模式'設置爲「SqlServer」時,可以輕鬆完成此操作。 。

您可以查詢數據庫(ASPState的)&因此表你在哪裏存儲您的會話(ASPStateTempSessions)[我用持久性存儲:-sstype P]

SELECT TOP 5 [SessionId] 
     ,[Created] 
     ,[Expires] 
     ,[LockDate] 
     ,[LockDateLocal] 
     ,[LockCookie] 
     ,[Timeout] 
     ,[Locked] 
     ,[SessionItemShort] 
     ,[SessionItemLong] 
     ,[Flags] 
    FROM [ASPState].[dbo].[ASPStateTempSessions] 

即使你知道你的會話ID,你可以用它來恢復你之前的會話。當您執行新的請求時,Asp.Net將生成一個新的SessionID。

相關問題