Come posso impostare esplicitamente le sessioni asp.net in modo che scadano SOLO alla chiusura del browser o al logou esplicito?

StackOverflow https://stackoverflow.com/questions/93888

  •  01-07-2019
  •  | 
  •  

Domanda

Per impostazione predefinita la scadenza della sessione sembra essere 20 minuti.

Aggiornamento:Non voglio che la sessione scada finché il browser non viene chiuso.

Aggiornamento2:Questo è il mio scenario.L'utente accede al sito.Gioca in giro per il sito.Lascia il computer per farsi una doccia (>20 minuti ;)).Ritorna al computer e Dovrebbe poter giocare.Chiude il browser, eliminando così il cookie di sessione.La prossima volta che accederà al sito da una nuova istanza del browser, dovrà effettuare nuovamente l'accesso.

In PHP posso impostare session.cookie_lifetime in php.ini su zero per raggiungere questo obiettivo.

È stato utile?

Soluzione

Se desideri estendere la sessione oltre i 20 minuti, modifica l'impostazione predefinita utilizzando l'amministratore IIS oppure puoi impostarla nel file web.config.Ad esempio, per impostare il timeout su 60 minuti in web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

Puoi fare lo stesso per un particolare utente nel codice con:

Session.Timeout = 60

Qualunque metodo tu scelga, puoi modificare il timeout su qualsiasi valore ritieni ragionevole per consentire ai tuoi utenti di fare altre cose e mantenere comunque la sessione.

Ci sono ovviamente degli svantaggi:per l'utente, esiste il possibile problema di sicurezza di lasciare il proprio browser incustodito e di averlo ancora connesso quando qualcun altro inizia a utilizzarlo.Per te c'è il problema dell'utilizzo della memoria sul server: più a lungo durano le sessioni, più memoria utilizzerai contemporaneamente.Che ciò sia importante o meno dipende dal carico sul tuo server.

Se non vuoi stimare un timeout prolungato ragionevole, dovrai utilizzare una delle altre tecniche già suggerite, richiedendo che alcuni JavaScript siano in esecuzione nel browser per eseguire il ping periodico del server e/o abbandonare la sessione quando una pagina viene scaricata (a condizione che l'utente non visiti un'altra pagina del tuo sito, ovviamente).

Altri suggerimenti

È possibile impostare un breve timeout della sessione (ad esempio 5 minuti) e quindi fare in modo che la pagina esegua periodicamente il polling del server, utilizzando Javascript per attivare una XmlHttpRequest ogni 2 minuti o avendo un iframe nascosto che punta a una pagina che si aggiorna ogni 2 minuti.

Una volta chiuso il browser, la sessione scade molto rapidamente poiché non ci sarebbe nulla a mantenerla attiva.

Questo non è un problema nuovo, ci sono diversi scenari che devono essere gestiti se vuoi cogliere tutti i modi in cui una sessione può terminare, ecco alcuni esempi generali di alcuni di essi:

  1. L'istanza o la scheda del browser è chiusa.
  2. L'utente esce dal tuo sito web utilizzando la stessa istanza o scheda del browser.
  3. Gli utenti perdono la connessione a Internet (ciò potrebbe includere l'interruzione dell'alimentazione del computer dell'utente o qualsiasi altro mezzo).
  4. L'utente si allontana dal computer (o in qualche altro modo smette di interagire con il tuo sito).
  5. Il server perde alimentazione/si riavvia.

I primi due elementi devono essere gestiti dal client che invia informazioni al server, generalmente si utilizzerà JavaScript per navigare verso una pagina di logout che fa scadere rapidamente la sessione.

Il terzo e il quarto elemento vengono normalmente gestiti impostando il timeout dello stato della sessione (può essere qualsiasi periodo di tempo).La quantità di tempo che utilizzi si basa sulla ricerca di un valore che consenta agli utenti di utilizzare il tuo sito senza sovraccaricare il server.Una regola pratica molto approssimativa potrebbe essere 30 minuti più o meno 10 minuti.Tuttavia il valore appropriato dovrebbe probabilmente essere oggetto di un altro post.

Il quinto elemento viene gestito in base alla modalità di archiviazione delle sessioni.Le sessioni archiviate nello stato non sopravvivranno al riavvio poiché si trovano nella ram del computer.Le sessioni archiviate in un database o in un cookie sopravviverebbero al riavvio.Potresti gestire la cosa come meglio credi.

Nella mia esperienza limitata quando questo problema si è verificato in precedenza, è stato stabilito che è sufficiente impostare il timeout della sessione su un valore accettabile.Tuttavia si può fare.

Questa è l'impostazione predefinita.Quando hai una sessione, memorizza la sessione in un "Cookie di sessione", che viene automaticamente eliminato alla chiusura del browser.

Se desideri avere la sessione tra 2 sessioni del browser, devi impostare Cookie.Scaduto su una data nella funzione.

Poiché la sessione di cui parli è archiviata dal server e non dal client, non puoi fare quello che vuoi.

Ma considera di non utilizzare la sessione lato server ASP.NET e di fare affidamento solo sui cookie.

Sfortunatamente, a causa della natura esplicita del web e del fatto che non esiste un collegamento permanente tra il server di un sito web e il browser di un utente, è impossibile sapere quando un utente ha chiuso il browser.Ci sono eventi e JavaScript che puoi implementare (ad es.onunload) che puoi utilizzare per effettuare chiamate al server che a sua volta potrebbe "uccidere" una sessione - Session.Abandon();

È possibile impostare la durata del timeout di una sessione all'interno di web.config, ricordare che questo timeout si basa sul tempo trascorso dall'ultima chiamata al server da parte del browser dell'utente.

Il timeout del browser non è stato aggiunto.

Non c'è modo di cancellare esplicitamente la sessione se non si comunica in qualche modo tra il client e il server nel punto di chiusura della finestra, quindi mi aspetterei l'invio di una richiesta URI speciale per cancellare la sessione nel punto di ricezione di una finestra chiudi messaggio.

Il mio Javascript non è abbastanza buono per darti le istruzioni effettive per farlo;Scusa :(

Non puoi, poiché non puoi controllare la risposta del client HTML.

In realtà perché hai bisogno di farlo?Finché nessuno può riprendere la sessione per utilizzarla nuovamente, questa scadrà dopo 20 minuti.Se le risorse contano, imposta una scadenza della sessione più aggressiva (la maggior parte delle società di hosting lo ha fatto, il che è terribilmente fastidioso) o utilizza meno oggetti nella sessione.Cerca di evitare qualsiasi tipo di oggetto, memorizza invece semplicemente le chiavi per recuperarle, questo è un progetto molto importante in quanto ti aiuta a ridimensionare la tua sessione su un server di stato quando diventi grande.

Correggimi se fraintendo l'intento della tua domanda, ma la domanda di fondo sembra essere meno su come forzare la fine della sessione quando un utente chiude il browser e più su come impedire che una sessione termini fino alla chiusura del browser.

Penso che la vera risposta a questa domanda sia rivalutare lo scopo per cui stai utilizzando le sessioni.Se li stai utilizzando per mantenere lo stato, sono d'accordo con le altre risposte che potresti essere sfortunato.

Tuttavia, un approccio preferibile consiste nell'utilizzare un meccanismo di stato persistente con lo stesso ambito della sessione del browser, ad esempio un cookie che scade quando il browser viene chiuso.Quel cookie potrebbe contenere informazioni appena sufficienti per riavviare la sessione sul server se è scaduto dall'ultima richiesta.Combinato con un timeout della sessione relativamente breve (5-10 minuti), penso che questo offra il miglior equilibrio tra l'utilizzo delle risorse del server e il fatto di non costringere l'utente a "riavviare" continuamente il sito.

Oh, hai riscritto la domanda.

Questo è assolutamente fattibile, purché Javascript sia attivo.Utilizzare qualsiasi Ajax temporizzato andrà bene.Verificare con la libreria di prototipi http://www.prototypejs.org PeriodicalExecutor o jQuery con il plugin ajax + timer.Imposta una pagina fittizia che il tuo esecutore chiamerà di tanto in tanto, in modo che la tua sessione sia sempre attiva a meno che non si disconnette (uccide il timer ajax nello stesso tempo) o chiude il browser (il che significa che l'esecutore viene comunque ucciso)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top