2008-09-26 5 views
12

Attualmente sto lavorando a un'applicazione Web che utilizza il framework ASP.NET 2.0. Devo reindirizzare a una certa pagina, ad esempio SessionExpired.aspx, quando scade la sessione utente. Ci sono molte pagine nel progetto, quindi aggiungere codice a ogni pagina del sito non è davvero una buona soluzione. Ho comunque MasterPages, che credo possa aiutare.Come posso reindirizzare a una pagina quando la sessione utente scade?

Grazie!

risposta

5

È possibile gestire questo nel global.asax in caso Session_Start. È possibile controllare un cookie di sessione nella richiesta lì. Se esiste il cookie di sessione, la sessione è scaduta:

public void Session_OnStart() 
    { 
     if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null) 
     { 
      HttpContext.Current.Response.Redirect("SessionTimeout.aspx") 
     } 

    } 

Purtroppo non ho trovato alcun modo elegante di scoprire il nome del cookie di sessione.

+0

Ho accettato questa risposta perché la chiave di identificazione di una sessione scaduta è verificare se il cookie di sessione esiste quando si ha a che fare con una nuova sessione. –

+0

Sfortunatamente non esiste un modo carino per ottenere il nome del cookie di sessione perché non è possibile eseguire "Session.CookieName" come con FormsAuthneticationTicket. La migliore raccomandazione che ho trovato è di avere solo una chiave/valore di appSetting che manterrà il nome del cookie di sessione. Quindi lo imposterai due volte, cosa che a nessuno piace fare, ma sembra il modo più conveniente per farlo. Solo i miei due centesimi. – dyslexicanaboko

5

Di solito aggiungo un controllo HtmlMeta alla raccolta Page.Header.Controls sulla pagina principale quando l'utente ha "effettuato l'accesso". Impostalo su Aggiorna nella tua pagina SessionExpired.aspx con una lunghezza di timeout appropriata e sei pronto per partire.

+0

E se la sessione scade a causa di qualsiasi altro motivo che timeout? È possibile? –

+0

Scadenza implica il timeout. È possibile perdere la sessione a livello di codice (Session.Abandon()) o se l'utente ha manomesso o rimosso il proprio cookie di sessione, ma a quel punto la sessione non è realmente * scaduta *, di per sé. Forse non sto capendo completamente il problema ... –

+0

E se l'utente trascorre molto tempo sulla stessa pagina a fare cose che usano ajax piuttosto che roba GET/POST standard? con questo metodo saranno comunque potenzialmente disconnessi. – coalvilledave

2

L'altro modo è dire al browser di reindirizzare se stesso (tramite javascript) dopo un certo periodo di tempo ... ma che può sempre essere disattivato dall'utente.

0

Aggiungere o aggiornare il file web.config per includere questo o qualcosa di simile:

<customErrors defaultRedirect="url" mode="RemoteOnly"> 
    <error statusCode="408" redirect="~/SessionExpired.aspx"/> 
</customErrors> 
4

Se ho capito bene, fuochi "Session_End" internamente e non dispone di un contesto HTTP ad esso associati:

http://forums.asp.net/t/1271309.aspx

Quindi non penso che si possa usare per reindirizzare l'utente. Ho visto gli altri suggeriscono di usare il "Session_OnStart()" evento nel file global.ascx:

http://forums.asp.net/p/1083259/1606991.aspx

non l'ho provato, ma mettere il seguente codice nel "global.ascx" potrebbe funzionare per si:

void Session_OnStart() { 
    if (Session.IsNewSession == false) 
    { 
    } 
    else 
    { 
     Server.Transfer("SessionExpired.aspx", False); 
    } 
} 
1

non è possibile reindirizzare l'utente quando la sessione scade, perché non c'è nessuna richiesta browser per reindirizzare:

  • Se l'utente visita il tuo sito entro il timeout di sessione (20 minuti per impostazione predefinita), la sessione non è terminata, quindi non è necessario reindirizzarli.
  • Se l'utente visita il sito dopo il termine della sessione, la sessione è già terminata. Ciò significa che saranno nel contesto di una nuova sessione - Session_OnEnd sarà già stato attivato per la vecchia sessione e invece riceverai Session_OnStart per la nuova sessione.

Altro che una caratteristica lato client (ad esempio JavaScript timer, ecc), è quindi necessario gestire il reindirizzamento in un Session_OnStart invece - ma ovviamente è necessario distinguere questo da qualcuno che viene al sito nuovo. Un'opzione consiste nell'impostare un cookie di sessione all'avvio della propria sessione (ovvero un cookie senza scadenza in modo che duri solo fino alla chiusura del browser), quindi cercare quel cookie in Session_OnStart - se è presente è un utente di ritorno con una scadenza sessione, se non è un nuovo utente.

Ovviamente è ancora possibile utilizzare Session_OnEnd per riordinare sul lato server - è solo l'interazione con il cliente che non è disponibile per voi.

1

Stai mettendo qualcosa nell'oggetto Session che dovrebbe essere sempre lì?In altre parole, se il log-in, si può essere messa qualcosa come UserID nella sessione

Session("UserID") = 1234 

Quindi, se questo è il caso, allora si potrebbe aggiungere qualcosa al tuo codebehind nella pagina master che verifica che valore. Qualcosa di simile a questo:

Dim UserID As Integer = 0 
Integer.TryParse(Session("UserID"), UserID) 

If UserID = 0 Then 
    Response.Redirect("/sessionExpired.aspx") 
End If 
+0

Mmmm ... che quasi funziona. Ma ho un problema. Gli utenti non effettuano l'accesso. Invece, viene utilizzata l'autenticazione di Windows. Ad ogni modo sto usando questa soluzione con un reindirizzamento alla pagina principale mentre trovo una soluzione finale. –

3

Usiamo autenticazione basata su form e chiamare questo metodo nel metodo Page Load

private bool IsValidSession() 
    { 
     bool isValidSession = true; 
     if (Context.Session != null) 
     { 
      if (Session.IsNewSession) 
      { 
       string cookieHeader = Request.Headers["Cookie"]; 
       if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        isValidSession = false; 
        if (User.Identity.IsAuthenticated) 
         FormsAuthentication.SignOut(); 
        FormsAuthentication.RedirectToLoginPage(); 
       } 
      } 
     } 
     return isValidSession; 
    } 
0

Stai cercando di reindirizzare la prossima richiesta, o reindirizzare immediatamente, senza l'intervento dell'utente? Se stai cercando di reindirizzare senza l'intervento dell'utente, puoi usare ClientScript.RegisterStartupScript nella tua Pagina Master per iniettare un po 'di javascript che reindirizzerà i tuoi client quando la loro sessione scadrà.

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    String timeoutPage = "SessionExpired.aspx"; // your page here 
    int timeoutPeriod = Session.Timeout * 60 * 1000; 

    sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod); 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true); 
0

Code from here

namespace PAB.WebControls 

{ using System; utilizzando System.ComponentModel; utilizzando System.Web; utilizzando System.Web.Security; utilizzando System.Web.UI;

[DefaultProperty("Text"), 

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")] 

public class SessionTimeoutControl : Control 
{ 
    private string _redirectUrl; 

    [Bindable(true), 
     Category("Appearance"), 
     DefaultValue("")] 
    public string RedirectUrl 
    { 
     get { return _redirectUrl; } 

     set { _redirectUrl = value; } 
    } 

    public override bool Visible 
    { 
     get { return false; } 

    } 

    public override bool EnableViewState 
    { 
     get { return false; } 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (HttpContext.Current == null) 

      writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]"); 

     base.Render(writer); 
    } 


    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (this._redirectUrl == null) 

      throw new InvalidOperationException("RedirectUrl Property Not Set."); 

     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Page.Request.Headers["Cookie"]; 

       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        if (Page.Request.IsAuthenticated) 
        { 
         FormsAuthentication.SignOut(); 
        } 

        Page.Response.Redirect(this._redirectUrl); 
       } 
      } 
     } 
    } 
} 

}