2010-12-09 4 views
1

Ich arbeite an der Einrichtung/Korrektur meiner Sitzung Timeout-Code und haben zahlreiche Artikel wie this one und this SO post für Ideen, wie dies am besten zu tun. Die Lösung zum Ermitteln eines Sitzungstimeouts, das immer wieder angezeigt wird, besteht darin, zuerst die Session.IsNewSession-Eigenschaft auf "true" zu überprüfen. Wenn ja, prüfen Sie, ob bereits ein Sitzungscookie vorhanden ist. Ich denke, die Logik hier ist, dass der Benutzer seine letzte Sitzung beendet hat, die abgelaufen ist, eine neue Sitzung gestartet hat, aber der alte Cookie wurde noch nicht entfernt. Der Code für diese Kontrollen sieht wie folgt aus:ASP.NET: Session.IsNewSession false nach Formular Timeout, sollte aber wahr sein?

if (Context.Session != null) 
{ 
    if (Session.IsNewSession) 
    { 
     string szCookieHeader = Request.Headers["Cookie"]; 
     if ((null != szCookieHeader) && (szCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
     { 
      Response.Redirect("sessionTimeout.htm"); // or whatever code to handle timeout 
     } 
    } 
} 

Jetzt bin ich zur Zeit mit einem Session-Timeout-Wert von 120 Minuten zu arbeiten, und ein Forms Timeout-Wert von 60 min. Diese beiden Linien aus meiner Datei web.config, resepectively sind hier:

<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" /> 
<authentication mode="Forms"> 
    <forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/> 
</authentication> 

So nach 60 Minuten (Ich stelle es auf 1-Test), habe ich eine Anfrage an den Server, und ich automatisch umgeleitet nach/Home/Customer, nehme ich an aufgrund des 'loginURL' Wertes in meiner web.config Zeile.

Das Problem ist, dass die Sitzung nicht beendet wird, und alle meine Sitzungszeitüberschreitungsprüfungen sind in der Home/Customer-Aktion (ich verwende MVC). Also werde ich nach Home/Customer umgeleitet, und ich laufe die obigen Checks durch, aber wenn ich zu Session.IsNewSession komme, ist es falsch, weil die Session noch am Leben ist (ich nehme an, weil ich noch innerhalb der 120 Minuten bin, die ich habe einstellen).

Also, endlich, meine Frage. Funktioniert dieses ganze Session-Timeout-Checking-Schema nur, wenn die tatsächliche Session ausläuft? Oder kann ich es für Forms Timeouts auch arbeiten lassen? Vielleicht besteht die Lösung darin, den Wert für das Zeitlimit für die Sitzung auf den Zeitlimitwert für Formulare festzulegen?

Antwort

2

Der ASP.NET-Sitzungscookie und der Forms-Authentifizierungscookie sind eigentlich völlig unterschiedliche Cookies. Wenn Ihr App-Pool wiederverwendet wird, verliert Ihr Benutzer beispielsweise seine Sitzung, aber nicht seine Login-Identität (vorausgesetzt, Sie verwenden in-proc Session). Die einzige Möglichkeit, Ihren Code zu treffen, denke ich, ist, wenn Ihr Sitzungszeitlimit kleiner war als Ihr Formular-Timeout. Auf jede andere Art und Weise werden Sie zur Anmeldeseite weitergeleitet, bevor Sie den Session-Timeout-Code eingeben.

Eine andere Option wäre, den Session-Timeout-Code auf Ihre Anmeldeseite zu verschieben.

Ein dritter wäre, den Scheck innerhalb Ihrer global.asax zu behandeln.

+0

Derzeit diese Kontrollen in der Controller-Aktion, die ausgeführt wird, wenn der Benutzer die Seite trifft, die sie anmelden (Home/Kunden) ermöglicht es, das ich das sein hielte Login-Seite, es sei denn, Sie sprechen über etwas anderes. Können Sie etwas über die Option global.asax erfahren? –

+0

Nein, du hast Recht. Es bedeutet nur, dass Sie IsNewSession nicht immer wahr werden lassen; nur wenn der Benutzer länger als 120 Minuten im Leerlauf war. –

+0

Könnten Sie bitte eine Code-/Einstellungslösung bereitstellen? –

0

Ich habe gerade einige Test, was Benutzer John Christensen sagte über

wenn Ihre Session-Timeout weniger als Ihre Formulare Timeout.

web.config

<system.web> 
    <sessionState mode="InProc" timeout="1" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" defaultUrl="~/Account/Login" name="MyPortalAuth" timeout="2" /> 
    </authentication> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    </system.web> 

Und es scheint, es Lösung arbeitet.

C# Filterattribut

public class SessionExpireFilterAttribute : ActionFilterAttribute 
    { 
     public UserManager<ApplicationUser> UserManager { get; private set; } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var ctx = HttpContext.Current; 

      // check if session is supported 
      if (ctx.Session != null) 
      { 
       // check if a new session id was generated 
       if (ctx.Session.IsNewSession) 
       { 
        // If it says it is a new session, but an existing cookie exists, then it must 
        // have timed out 
        string sessionCookie = ctx.Request.Headers["Cookie"]; 
        if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
        { 

         if (ctx.Request.IsAuthenticated) 
         { 
          FormsAuthentication.SignOut(); 
         } 
         RedirectResult rr = new RedirectResult(loginUrl); 
         filterContext.Result = rr; 
         //ctx.Response.Redirect("~/Account/Logon"); 

        } 
       }     
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 
+0

ANWENDUNG ** ActionFilter **? –

Verwandte Themen