2013-10-12 3 views
7

Ich habe eine MVC4-Anwendung mit Windows Authentication. Der Benutzer kann die URL einer der 10 Ansichten eingeben, um die Anwendung zu laden. Es gibt keine bestimmte HomepageSession Start und Action Filter für Sitzung Timeout-Behandlung

Ich muss zu einer Sitzungszeitlimitansicht umleiten, wenn der Benutzer für mehr als eine Minute im Leerlauf war. Ich habe den Sitzungszeitlimitwert in der Konfigurationsdatei als eine Minute behalten. Und ich habe eine action filter erstellt, um einen bestimmten Sitzungswert zu überprüfen. Dieser bestimmte Sitzungswert wird in Session_Start von Global.asax festgelegt.

Aber wenn die Zeitüberschreitungsperiode vorbei ist, trifft die Anforderung erneut die Session_Start und es wird den Wert zugewiesen. Daher leitet mein Aktionsfilter nicht zur Fehleransicht um. Was sind die möglichen Lösungen, um dies zu überwinden?

Web.Config

<system.web> 
    <!--Impersonate--> 
    <identity impersonate="true"/> 
     <!--Session Mode and Timeout--> 
    <sessionState mode="InProc" timeout="1" /> 
    <authentication mode="Windows"> 
    </authentication> 
    <authorization> 
     <allow users="?" /> 
    </authorization>  
</system.web> 

Aktion Filter

[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class SessionCheckAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) 
    { 
     string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower(); 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var activeSession = session["IsActiveSession"]; 
     if (activeSession == null) 
     { 
      //Redirect 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content("~/Error/SessionTimeout"); 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
     } 
    } 
} 

Global.asax

protected void Session_Start(object sender, EventArgs e) 
{ 
    Session["IsActiveSession"] = DateTime.Now; 
} 
+0

Referenz: http://stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call – Lijo

+0

Und http://stackoverflow.com/questions/ 16259230/global-filter-ajax-success-handlers und [408 Error Code] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) – Lijo

Antwort

10

Statt eine der Einstellung session value und überprüfen Sie es in Ihrem Aktionsfilter, überprüfen Sie einfach HttpContext.Current.Session.IsNewSession, um zu sehen, ob eine neue Sitzung für die aktuelle Anfrage erstellt wurde. Ändern Sie Ihre Action-Filter, würden Sie mit etwas so enden:

[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class SessionCheckAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) 
    { 
     string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower(); 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     if (session.IsNewSession) 
     { 
      //Redirect 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content("~/Error/SessionTimeout"); 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
     } 

    } 
} 

wenn Sie Lust haben möchten sicherstellen, dass sie eine frühere Sitzung vor der neuen Sitzung hatte, die für diese Anforderung erstellt wurde, können Sie aktualisieren die if Aussage zu überprüfen, ob ein alter Session-Cookie mit der Anfrage gesendet wurde:

string cookieHeader = filterContext.HttpContext.Request.Headers["Cookie"]; 
if (session.IsNewSession && cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0) 
{ 
    ... 
} 

Aber da es so aussieht, können Sie sie auf eine Anmeldeseite senden, ist dies wahrscheinlich nicht etwas, was man über hier kümmern. Wenn Sie diese Überprüfung verwenden, beachten Sie, dass dieser Code den Standard "ASP.NET_SessionId" Cookie-Namen annimmt; Dies könnte in Ihrer web.config geändert werden. In diesem Fall müssten Sie entweder den Parameter IndexOf mit dem neuen Cookie-Namen oder get the cookie name programmatically aktualisieren.

+1

Blog-Post-Link ist kaputt. – RickNZ

+2

Danke, ich habe es ersetzt. – markegli

+1

Der Link zum Erklären, wie man nach einer alten Sitzung sucht, war nicht ideal, also habe ich die Erklärung einfach inline verschoben. – markegli