2013-10-12 18 views
7

Ho un'applicazione MVC4 con Windows Authentication. L'utente può digitare l'url di una qualsiasi delle 10 viste per caricare l'applicazione. Nessuna home page specificaInizio sessione e filtro azione per sessione Gestione timeout

Devo reindirizzare a una vista di timeout della sessione se l'utente era inattivo per più di un minuto. Ho mantenuto il valore di timeout della sessione nel file di configurazione come un minuto. E ho creato un action filter per controllare un particolare valore di sessione. Questo particolare valore di sessione è impostato nello Session_Start dello Global.asax.

Tuttavia, quando il periodo di timeout è scaduto, la richiesta tocca nuovamente lo Session_Start e sta assegnando il valore. Quindi il mio filtro di azione non sta reindirizzando alla vista di errore. Quali sono le possibili soluzioni per superare questo?

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> 

Operazione filtro

[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

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

+0

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

risposta

10

Invece di impostare un il valore della sessione e controllandolo nel filtro azione, è sufficiente controllare HttpContext.Current.Session.IsNewSession per verificare se è stata creata una nuova sessione per la richiesta corrente. Modificare il filtro azione, si finirebbe con qualcosa di simile:

[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); 
     } 

    } 
} 

se si vuole ottenere fantasia e assicurarsi che essi avevano una sessione precedente prima della nuova sessione che è stato creato per questa richiesta, è possibile aggiornare il if dichiarazione per controllare se un vecchio cookie di sessione è stato inviato con la richiesta:

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

Ma poiché sembra che li sta inviando a una pagina di login, questo non è probabilmente qualcosa che si deve preoccupare di qui. Se si utilizza questo controllo, si noti che questo codice assume il nome predefinito del cookie "ASP.NET_SessionId"; questo potrebbe essere cambiato nel tuo web.config, nel qual caso dovresti aggiornare il parametro IndexOf con il nuovo nome del cookie o get the cookie name programmatically.

+1

Il link al post del blog è rotto. – RickNZ

+2

Grazie, l'ho sostituito. – markegli

+1

Il collegamento per spiegare come verificare una sessione precedente non era l'ideale, quindi ho appena spostato la spiegazione in linea. – markegli

Problemi correlati