2010-09-17 18 views
33

Sono sorpreso di non aver trovato nessuna risposta.imposta il cookie per scadere alla fine della sessione? asp.net

Come si imposta il mio sessionid nel mio cookie alla scadenza alla fine della sessione? (quando il browser si chiude o l'utente è rimasto inattivo per un periodo di tempo).

Le due soluzioni che ho trovato sono stati

(httpcookie).Expires = HttpContext.Current.Session.Timeout 

che mi ha dato un errore di compilazione in modo da non so se l'utente controllò il codice prima di postare. E l'altro era di impostare la data di scadenza a 1 giorno fa che il mio istinto dice che è sbagliato. Come faccio a fare questo?

+0

http://stackoverflow.com/questions/12582689/delete-cookies-on-session-timeout – Shurmajee

risposta

2

TimeOut restituisce un int, Expires si aspetta DateTime, motivo per cui tale codice non verrà compilato. L'impostazione della data di scadenza fino alla data precedente revoca immediatamente il cookie, quindi probabilmente non è quello che desideri. Se hai lasciato la data di scadenza non utilizzata, il cookie scadrà non appena l'utente ha chiuso il browser.

Se si desidera che il cookie sia legato alla Sessione particolare, perché coinvolgere il cookie in primo luogo? Potresti certamente continuare ad estendere la data di scadenza del cookie ogni volta che l'utente ha esteso la sessione utilizzando la tua applicazione, ma sembra un lavoro inutile. Usa solo Session.

Sentitevi liberi di approfondire il problema.

+0

Come faccio 'Basta usare Session'? –

+0

Ciò significava saltare le cose persistenti in un cookie e utilizzare semplicemente la sessione. Se hai effettivamente bisogno di sapere come usare * la sessione, ci sono domande per questo. Un breve esempio è 'Session [" someKey "] = someString; string retrievedValue = (stringa) Sessione ["someKey"]; ' –

+0

+1. Voglio dire che 'HttpContext.Current.Session' era nullo, quindi sono andato con i cookie e ho esteso la data di scadenza ogni volta che l'utente visita come hai detto. –

50

Stai parlando di un cookie non persistente. Di default asp.net invia i cookies in questo modo. La principale differenza tra loro è che un cookie persistente ha un valore di scadenza impostato.

Quindi, se non si desidera che il cookie persista, non impostare il valore di scadenza.

Detto questo, il cookie rimarrà in memoria fino a quando il browser non sarà effettivamente chiuso. Diciamo che navigano sul tuo sito e imposti un cookie non persistente. Fanno cose e sfogliano. Successivamente, utilizzando la stessa istanza del browser, tornano al tuo sito. Il cookie sarà ancora lì.

Ora, se hanno chiuso il browser in qualsiasi momento, il cookie verrebbe svuotato.

Il punto è, non impostare l'intestazione di scadenza. Soprattutto non a quando scade la data della sessione. Le date delle sessioni sono in genere solo 20 minuti circa in futuro, ma la data di scadenza viene ripristinata mentre l'utente naviga nel tuo sito.

aggiornamento ===== =====

Ho usato il seguente codice per il test:

protected void Page_Load(object sender, EventArgs e) { 
     if (!Page.IsPostBack) { 
      HttpCookie c = Request.Cookies["test"]; 
      if (c != null) { 
       Response.Write(String.Format("test value is {0} <br />", c.Value)); 
      } 
     } else { 
      HttpCookie c = new HttpCookie("test"); 
      c.Value = "HERE IT IS"; 
      Response.Cookies.Add(c); 
     } 
    } 

    protected void Button1_Click(object sender, EventArgs e) { 
     Response.Write("clicked<br />"); 
    } 

il semplice file aspx aveva un pulsante che ha sparato tale gestore Button1_Click. Quando inizialmente lo sfoglio utilizzando uno dei browser più recenti (ad esempio, firefox, chrome) non è presente alcun cookie. Dopo aver fatto clic sul pulsante, viene impostato un cookie. Quindi ho chiuso completamente il browser, ho riaperto e sono tornato al sito. In tutti i casi il cookie era sparito.

+1

cool, quindi la soluzione è non toccare nulla, basta impostare il valore del cookie e lasciarlo a quello. Pensavo ci fosse dell'altro. –

+1

No. È piuttosto semplice – NotMe

+0

Prima di contrassegnare questo come accettato voglio sapere. Ho chiuso il mio browser Firefox (3.6.10) e l'ho riaperto. Ero ancora loggato. Perché? Sembra che aggiornare/impostare la scadenza a 30 minuti avanti sembra una buona soluzione. –

8

È importante notare che in questi giorni non è possibile contare su un cookie di sessione che viene eliminato quando l'utente chiude il browser. Sia Chrome che Firefox hanno apportato modifiche nel 2012 o giù di lì - guarda i vari link allo this answer.

Ora, non riuscire a eliminare i cookie di sessione mi sembra una terribile, orribile, non buona, pessima falla di sicurezza, per non parlare di una violazione di ogni RFC rilevante, ma a quanto pare i nostri Overlords di Google (e Mozilla) lo sanno meglio.

Non sono sicuro quale sia la soluzione migliore, ma l'approccio che sto adottando è di reimpostare la proprietà "Scade" sul cookie a un'ora in futuro dopo ogni chiamata. Questo non è precisamente il comportamento desiderato, ma penso che sia meglio che permettere ai cookie cruciali di rimanere sostanzialmente per sempre.

Aperto ad altri suggerimenti o chiarimenti.

+0

Se trascorri del tempo di qualità nella costruzione del cookie, può essere un salvataggio nel bilanciamento del carico basato su richiesta. Naturalmente, nulla è sicuro al 100%, ma un pacchetto di biglietti criptati all'interno del cookie è l'approccio migliore senza utilizzare altri schemi di occultamento. – GoldBishop

1

NON utilizzare il controllo di accesso, rende più difficile.

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
    // Check user and password in database 
    bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text); 

    // Set cookie to be not persistent - this means if the user closes the browser, 
    //autentification cookie will be deleted and the user is not longer logged 
    bool isPersistentCookie = false; 

    // Login user with the new username 
    FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie); 
} 
Problemi correlati