2010-12-15 29 views
1

我有一個asp.net 4.0應用程序使用窗體身份驗證設置爲45分鐘超時。我想在會話過期時將用戶重定向到超時頁面。誰能告訴我如何做到這一點?我正在運行.net 4.0。Global.asax.cs中的Session_End沒有使用表單身份驗證觸發

的web.config有:

<authentication mode="Forms"> 
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" 
    defaultUrl="~/Default.aspx" protection="All" timeout="45" 
    requireSSL="false"> 
    </forms> 
</authentication> 

的Global.asax.cs文件有:

void Session_End(object sender, EventArgs e) 
{ 
    Response.Redirect("~/Timeout.aspx"); 
} 

回答

4

這是不可能做一個重定向在Session_End方法。它沒有作爲請求的結果運行,所以它沒有Response對象,並且沒有響應在任何地方重定向。

由於會話過期,無法在瀏覽器中執行任何操作。 HTTP協議是面向請求的,所以如果沒有瀏覽器請求,就無法將消息從服​​務器推送到瀏覽器。

瀏覽器找不到會話是否已過期。如果您要輪詢服務器以檢查會話是否已過期,則會使會話保持活動狀態,從而破壞超時的目的。

您可以只使用客戶端腳本後45分鐘做一次重新定位:

window.setTimeout(function() { 
    window.location.href = '/Timeout.aspx'; 
}, 1000*45*60); 

然而,這將使只是基於時間的重定向,因爲這個瀏覽器窗口的最後一次聯繫的服務器。如果您針對同一個會話有多個瀏覽器窗口,則可能會話實際上沒有超時。

+0

重定向甚至可以是刷新,或者是某種檢查會話數據的ajax調用。 – 2010-12-15 18:30:13

+0

你說得對。你認爲我可以使用類似jQuery idleTimer(http://paulirish.com/2009/jquery-idletimer-plugin/),將它設置爲45分鐘,就像你使用(window.setTimeout)並重定向一樣?你認爲這可能運作良好?我可以等待45分鐘的空閒時間並強制註銷/會話結束/重定向。 – capdragon 2010-12-15 18:31:56

+0

@ krefftc:我沒有在鏈接到的頁面上閱讀太多內容,因爲它非常生澀且令人討厭的動畫,但我認爲空閒計時器會嘗試查找用戶是否在瀏覽器中處於活動狀態。會話超時並不關心用戶在瀏覽器中做什麼,除非瀏覽器從服務器獲取某些內容,所以它一點也不受影響。因此,'setTimeout'會更好地對應於會話在服務器上超時的時間。 – Guffa 2010-12-15 18:50:52

3

如何您的會話狀態實現的? Session_End只在使用InProc時有效。

http://www.eggheadcafe.com/articles/20021016.asp

+0

我想任何會話狀態窗體身份驗證使用。 – capdragon 2010-12-15 18:27:11

+1

表單身份驗證!=會話狀態。 – 2010-12-15 18:31:00

+0

那麼無論如何默認是InProc。您必須手動將其更改爲SQL Server或其他任何。是的,我知道這是7年後,但我不在乎。 – 2017-02-01 08:37:42

0

在MVC,你可以在_ViewStart.cshtml

添加該代碼

_ViewStart.cshtml:

@{ 
    Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));  

    if(Session.IsNewSession) 
     Response.Redirect(「Logout.aspx");// or another page which you want. 
} 

How to Redirect on Session End