Come invalidare una sessione alla chiusura del browser?

3

Ho un'applicazione web in cui la sessione web deve scadere dopo un periodo di tempo stabilito. Tuttavia, catturare l'evento di chiusura del browser non è una buona idea invalidare una sessione utente.

Quale può essere una soluzione alternativa per invalidare una sessione utente alla chiusura del browser?

    
posta ABC 26.09.2012 - 13:39
fonte

2 risposte

5

La convalida della sessione (in) è solitamente un concetto di server: una sessione è "valida" finché il server la considera valida, cioè garantisce l'accesso a qualsiasi dato e le funzionalità sono definite per essere basate sulla sessione.

Di solito ciò che si fa è:

  • Il server ha un timeout di sessione. Se non si sente nulla dal client per qualche tempo, la sessione scompare.
  • Viene fornito un pulsante "logout" esplicito, quando gli utenti vogliono attivare una sessione in anticipo.

Dalla tua domanda, suppongo che ti piacerebbe che la "chiusura" del browser agisse come un pulsante di disconnessione. Se riesci a catturare un evento di chiusura, allora va bene. In caso contrario, è possibile utilizzare un breve timeout (ad esempio due minuti) e avere alcuni Javascript in esecuzione sullo sfondo della pagina per eseguire regolarmente attività "keep-alive" nascosta con il server (ad esempio ogni 90 secondi) purché la scheda corrispondente / la finestra è aperta.

In ogni caso, spetta al server imporre un timeout. Non puoi gestirlo in modo affidabile solo dal lato client, se non altro perché il client può scomparire improvvisamente senza alcuna traccia (la batteria del laptop dell'utente è vuota, l'utente è in roaming in un'auto / treno e esce dalla portata di una stazione, macchina dell'utente o crash del browser , l'utente è malvagio e uccide il suo browser solo per infastidirti ... le possibilità sono infinite).

    
risposta data 26.09.2012 - 14:50
fonte
2

Se non imposti una scadenza per il cookie di sessione, il browser lo cancellerà ogni volta che il browser viene chiuso.

Set-Cookie: SessionId=1ogf87b04oajp1lvkrid2iciskd2acug; path=/; HttpOnly

Questo ti lascia con la domanda di scadere della sessione.

Questo dovrebbe essere fatto dal controllo sul lato server: su ogni richiesta (valida), memorizza il tempo della richiesta in / per questa sessione. Ogni volta che viene effettuata una richiesta successiva, verificare l'ora corrente rispetto al tempo di richiesta precedente. Se l'ultima attività era più di X minuti fa, considera la sessione scaduta e espira esplicitamente il cookie di sessione impostando una scadenza molto indietro. L'impostazione di un tempo di scadenza del cookie molto indietro nel passato (ad esempio nel 1971-01-01 dirà al cliente che è in grado di raccogliere i cookie di sessione, assicurandosi comunque di eseguire l'effettiva scadenza sul lato server.

Set-Cookie: SessionId=false; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

Non dovresti fare affidamento su script client o simili, non è necessario per la gestione delle sessioni (e non può essere comunque implementato in modo affidabile).

Modificato per aggiungere:
Alcuni framework hanno una buona implementazione di sessione, mentre la maggior parte fa un lavoro OK-ish. Tuttavia, alcuni (sto guardando voi Zend Framework) sono decisamente sbagliati. Cerca di assicurarti di capire quali sono i cookie inviati e di non confondere il cookie di sessione con, ad esempio, un cookie "ricordami".

    
risposta data 26.09.2012 - 17:23
fonte

Leggi altre domande sui tag