2010-12-15 3 views
1

Ich habe eine asp.net 4.0-Anwendung, die Formularauthentifizierung auf eine Zeitüberschreitung bei 45 Minuten festgelegt ist. Ich möchte den Benutzer auf eine Timeout-Seite umleiten, wenn die Sitzung abgelaufen ist. Kann mir jemand sagen, wie ich das mache? Ich betreibe .net 4.0.Session_End in Global.asax.cs nicht unter Verwendung der Formularauthentifizierung

web.config hat:

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

Global.asax.cs Datei hat:

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

Antwort

4

Es ist nicht möglich, eine Umleitung in der Session_End Methode zu tun. Es wird nicht als Ergebnis einer Anfrage ausgeführt, also hat es kein Response Objekt und es gibt keine Antwort auf eine Weiterleitung.

Es ist nicht möglich, etwas in dem Browser als Ergebnis der Sitzung ablaufen zu lassen. Das HTTP-Protokoll ist anforderungsorientiert, so dass es keine Möglichkeit gibt, eine Nachricht vom Server an den Browser zu senden, ohne dass der Browser danach fragt.

Der Browser kann nicht herausfinden, ob die Sitzung abgelaufen ist oder nicht. Wenn Sie den Server abfragen würden, um zu überprüfen, ob die Sitzung abgelaufen ist, würde die Sitzung am Leben bleiben und den Zweck des Zeitlimits vereiteln.

Sie können eine Umleitung nach 45 Minuten machen nur Client-Skript:

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

Dies wird jedoch die Umleitung nur auf der Grundlage der Zeit machen, da diese Browser-Fenster zuletzt den Server kontaktiert. Wenn Sie mehr als ein Browserfenster für dieselbe Sitzung haben, ist es möglich, dass die Sitzung tatsächlich nicht abgelaufen ist.

+0

die Weiterleitung könnte eine Aktualisierung sogar sein, oder eine Art von Ajax-Aufruf, der Sitzungsdaten überprüft. –

+0

Sie haben Recht. Du denkst, ich könnte etwas wie jQuery idletimer (http://paulirish.com/2009/jquery-idletimer-plugin/) verwenden, setze es auf 45 Minuten, wie du es mit (window.setTimeout) gemacht hast, und redirect? Denkst du, das könnte gut funktionieren? Ich kann 45 Minuten Leerlaufzeit warten und eine Abmeldung/Session-Ende/Redirect erzwingen. – capdragon

+0

@krefftc: Ich habe auf der verlinkten Seite nicht viel gelesen, aufgrund der sehr ruckartigen und nervigen Animationen, aber ich denke, dass der Leerlauftimer versucht herauszufinden, ob der Benutzer im Browser aktiv ist oder nicht. Das Sitzungs-Timeout kümmert sich überhaupt nicht darum, was der Benutzer im Browser tut, es sei denn, der Browser ruft etwas vom Server ab, so dass dies überhaupt nicht betroffen ist. Daher würde "setTimeout" besser dem Zeitlimit der Sitzung auf dem Server entsprechen. – Guffa

3

Wie ist Ihr Sitzungszustand umgesetzt? Session_End funktioniert nur, wenn Sie InProc verwenden.

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

+0

Ich denke, was den Sitzungszustand Formularauthentifizierung verwendet. – capdragon

+1

Formularauthentifizierung! = Sitzungsstatus. –

+0

Nun jedenfalls ist der Standard InProc. Sie müssten es manuell zu SQL Server oder was auch immer ändern. Ja, ich weiß, das ist 7 Jahre später, aber das ist mir egal. –

0

Auf MVC können Sie diesen Code in _ViewStart.cshtml Zugabe

_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

Verwandte Themen