2017-03-02 71 views
0

我正在開發ASP.Net MVC應用程序。使用SqlServer模式時會話超時不起作用

我們使用了sessionState模式SQLServer,並且我將超時設置爲20分鐘。

<sessionState mode="SQLServer" 
       sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa" 
       cookieless="false" 
       timeout="2" /> 

在web配置中的代碼是這樣的。

我也設置了登錄頁面。

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

現在,當會話過期時,我想導航用戶登錄頁面。

我檢查了很多東西,但我無法理解它是如何工作的?以及如何導航會話過期的用戶登錄頁面?

它在InProc模式下工作。我以相同的方式使用它,並且用戶被重定向到會話過期時登錄。

但我無法在SQLServer模式下完成同樣的事情。

我無法理解我錯過了什麼?

我檢查Session State也發現Session timeout handled in SQLServer Mode

編輯: - 我想重定向用戶每當另一個HTTP請求的是會話中執行到登錄頁面。

+0

會話使用*滑動*超時。每次您再次訪問您的網站時,會話超時都會重置。 –

+0

@ChrisPratt好的。我應該如何處理這種情況?是因爲SQLServer模式嗎? –

+0

這就是我要說的。你不能。在用戶處於活動狀態時,會話永遠不會超時,無論是20分鐘還是2小時。如果用戶空閒,並且會話超時,則下一個請求將簡單地啓動一個新會話。您最可能想要做的只是將身份驗證設置爲20分鐘後過期。這將迫使用戶在20分鐘後重新登錄,因爲這是*不可*滑動。 –

回答

1

通常瀏覽器不知道服務器上發生了什麼。除非發生HTTP往返,否則它將記住頁面呈現時的會話狀態。

此外,你的會話cookie可能是HttpOnly,所以沒有辦法讓頁面檢查會話cookie的存在。

之一來完成你想要什麼樣的方式是:

  1. 添加隱藏iFrame到您的網頁。設置iFrame的SRC的處理程序在你的網站

  2. 處理程序沒有做太多,除了返回200 OK,加上刷新標題設置爲幾秒鐘,從而使處理程序不斷輪詢。

    context.Response.AddHeader("REFRESH", "2"); 
    
  3. 添加framebreaker碼到您的登錄頁面

    if (top.location != location) { 
        top.location.href = document.location.href ; 
    } 
    
  4. 當處理程序的請求與會話過期時,它會被重定向到通過窗體身份驗證的登錄頁面;當返回登錄頁面時,它會打破你的iFrame並將整個窗口重定向到登錄頁面。

或者,您可以執行其他人的操作,這是等待用戶請求另一個頁面。

+0

當頁面發出另一個http請求時,甚至可以識別會話過期。當它識別另一個http請求上的會話過期時,我想將用戶重定向到登錄操作方法。 –