[英]Session_End in Global.asax.cs not firing using forms authentication
我有一個asp.net 4.0應用程序,使用表單身份驗證設置為45分鍾超時。 我想在會話過期時將用戶重定向到超時頁面。 誰能告訴我怎么做? 我正在運行.net 4.0。
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");
}
在Session_End
方法中無法進行重定向。 它不是由於請求而運行,因此它沒有Response
對象,並且沒有響應任何地方的重定向。
由於會話過期,在瀏覽器中無法執行任何操作。 HTTP協議是面向請求的,因此在沒有瀏覽器要求的情況下,無法將消息從服務器推送到瀏覽器。
瀏覽器無法確定會話是否已過期。 如果您要輪詢服務器以檢查會話是否已過期,它將使會話保持活動狀態,從而違背超時的目的。
您可以使用客戶端腳本在45分鍾后進行重定向:
window.setTimeout(function() {
window.location.href = '/Timeout.aspx';
}, 1000*45*60);
但是,這將使重定向僅基於此瀏覽器窗口上次聯系服務器以來的時間。 如果同一會話有多個瀏覽器窗口,則會話可能實際上沒有超時。
你的會話狀態是如何實現的? Session_End僅在使用InProc時有效。
在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.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.