2009-03-17 15 views
7

Sto utilizzando FormsAuthentication e Provider SqlMembership di ASP.Net. Vorrei fornire una funzionalità per reindirizzare alla pagina di accesso quando la sessione sottostante è scaduta. Inserisco il seguente blocco di codici nella mia BasePage OnInit. Per quanto ho provato, continua sempre a reindirizzare alla pagina di accesso anche se ho fornito l'ID utente e la password corretti. Per diritti, mi dovrebbe portare alla pagina predefinita. È abbastanza urgente e qualsiasi aiuto sarebbe molto apprezzato.Come reindirizzare alla pagina di accesso quando la sessione è scaduta (ASP.NET 3.5 FormsAuthen)

saluti, Thurein

if (Context.Session != null && Session.IsNewSession && this.Request.IsAuthenticated) 
     { 
      string cookieHeader = Request.Headers["Cookie"]; 
      if (cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0) 
      { 


        HttpContext.Current.Session.Abandon();      
        FormsAuthentication.SignOut();       
        Response.Redirect(FormsAuthentication.LoginUrl);           

      } 
     } 
+0

Questa funzionalità non è integrata nell'autenticazione Forms? –

+0

@Rob: Sì, lo è. –

risposta

19

Non è necessario alcun codice personalizzato per questa funzionalità, è supportato dal framework. Basta configurarlo nel web.config:

<authentication mode="Forms"> 
    <forms defaultUrl="~/Default.aspx" 
     loginUrl="~/Login.aspx" 
     slidingExpiration="true" 
     timeout="60" /> 
</authentication> 

Con la configurazione sopra, l'utente sarà sempre reindirizzato alla pagina Login.aspx quando la loro sessione scade. C'è un timeout di 60 minuti e la scadenza di scorrimento significa che il timeout viene esteso ogni volta che l'utente effettua una richiesta all'applicazione Web, quindi se rimane attivo la sessione non scadrà. Una configurazione come questa ti offre un altro vantaggio rispetto a quello che hai provato a fare: una volta che l'utente si collega, verrà automaticamente reindirizzato alla risorsa che ha originariamente richiesto. E puoi sempre ignorare e personalizzare questo comportamento.

+0

Hi Pawel Krakowiak, Apprezzo per la tua risposta. :) In effetti, ho già fatto le stesse configurazioni che hai menzionato sopra. :(Ma non so cosa mi sia venuto in mente di fare codifica personalizzata per soddisfare le funzionalità già esistenti Cordiali saluti, Kyaw Thurein –

+0

Diciamo che questo accade quando fanno clic su un pulsante Salva in un modulo che fa un postback, sono indirizzati alla pagina di login, quindi accedono e tornano alla risorsa originale. Il postback sarà quindi completo in modo che i dati del modulo possano essere elaborati come al solito? – AaronLS

+1

@aaronls: No, i dati andranno persi. L'URL richiesto è stato ricordato –

13

Pawel's answer è parzialmente corretto, ma è anche necessario impostare la durata Session su un valore superiore alla durata del cookie di autenticazione moduli. Il valore dell'autenticazione moduli timeout influisce solo sulla durata del cookie di autenticazione. Nell'esempio fornito, la durata del cookie di autenticazione è di 60 minuti, ma la durata predefinita della sessione è di 20 minuti. Se un utente lasciava la sua macchina per più di 20 minuti, i suoi dati di sessione venivano scartati, i successivi tentativi di fare riferimento a un valore archiviato in sessione comporterebbero un'eccezione (ad esempio System.NullReferenceException se si tenta di .ToString() o un cast).

È possibile impostare questo livello globale nell'applicazione configurando le impostazioni sessionState nel file web.config:

<sessionState 
    mode="InProc" 
    cookieless="false" 
    timeout="70"/> 

Aggiunta di cinque o dieci minuti per il timeout della sessione fornisce un buon tampone.

+0

Grazie per la spiegazione aggiuntiva. È davvero importante quando usi le variabili di sessione. Ho solo l'abitudine di controllare paranoicamente la loro esistenza/valore prima di provare a usarli. ;) –

+1

Lo so ... è un peccato che non abbiano un'impostazione signoutIfSessionExpired = "true". – Kev

+0

Ciao Kev, Ti ringrazio davvero per il tuo consiglio. Saluti, Thurein –

Problemi correlati