2010-06-09 24 views
5

Sto utilizzando lo stato sessione ASP.NET per tenere traccia degli utenti registrati sul mio sito.Modifica scadenza sul cookie Stato sessione di ASP.NET

Tuttavia, un problema che sto incontrando è che per impostazione predefinita i cookie di sessione ASP.NET sono impostati per scadere quando il browser si chiude.

http://ahb.me/43e

Ho provato a installare il mio biscotto ASP.NET_SessionId e modificare la scadenza del cookie utilizzando qualcosa di simile al seguente codice:

Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(1); 

Nessuno di questi approcci lavoro, tutti insieme una secondo cookie con lo stesso nome.

C'è un modo per modificare la scadenza del cookie di sessione?

risposta

2

Suggerirei di utilizzare FormsAuthentication per tenere traccia degli utenti connessi. È possibile utilizzare un FormsAuthenticationCookie persistente per ottenere ciò che si desidera.

Oppure se si desidera veramente utilizzare lo stato sessione, provare this technique.

+0

L'approccio FormsAuthCookie consente solo agli utenti che ritornano di ignorare l'accesso ai moduli se si riconnettono all'interno di una finestra temporale specifica. Non mantiene nessuno stato che potrebbero aver precedentemente creato sul server. – ChrisW

+0

@ChrisW - "Non mantiene nessuno stato che potrebbero aver precedentemente creato sul server" - ovviamente no, tale stato dovrebbe essere persistente, ad es. in un database, ad es.usando Profile. – Joe

+0

La tecnica che hai collegato funziona, grazie :) –

1

Un'ipotesi: forse la modifica della sessione.configurazione all'interno di web.config potrebbe modificare la scadenza dei cookie? Puoi dare un'occhiata here?

+1

Questo non funziona. Il timeout specificato nella configurazione dello stato della sessione è applicabile solo al sessionstore. Non il cookie memorizzato nel browser. – hreinn1000

1

Penso che provare a mantenere viva la sessione per un lungo periodo sia l'approccio sbagliato e limiti la scalabilità. Il cookie di sessione punta a una sessione specifica che viene gestita da IIS sul server. In generale, si si desidera che la sessione si chiuda dopo che l'utente chiude il proprio browser in modo da non consumare tutte le risorse del server disponibili per gli utenti inattivi. Si desidera chiudere la sessione per la chiusura di un utente in partenza e le risorse rese disponibili a un nuovo utente in arrivo. Ecco perché il cookie di sessione scade.

Se si desidera mantenere uno stato utente dopo che l'utente chiude il browser, è sempre possibile guardare qualcosa come Profile. Oppure, se questo è per qualcosa come un carrello della spesa, è possibile mantenere il carrello della spesa in un database e quindi ricollegarlo all'utente al successivo accesso.

+1

Sono di fronte a questo problema con un carrello della spesa, ma stavo progettando di utilizzare l'id di sessione per gli utenti non registrati, quindi il tuo ultimo suggerimento non corrisponderà al conto. Altre idee? –

+0

@DrazenBjelovuk: Sto affrontando lo stesso problema, ho un carrello della spesa nel database e ho voluto memorizzare un riferimento ad esso nella sessione per gli utenti non registrati. Posso chiederti come hai risolto il problema? Eventuali suggerimenti? Grazie. –

+0

@ TomPažourek Ciao Tom. Ho finito per utilizzare un cookie separato che rappresenta un ID generato a caso di un record del carrello temporaneo appena creato nel database, con un campo di scadenza impostato sullo stesso valore della scadenza del cookie. Al momento della registrazione, i prodotti di quel carrello (rappresentati in una tabella CartProduct) avrebbero semplicemente il loro campo ID utente precedentemente vuoto impostato sull'ID dell'account utente appena creato e il record del carrello temporaneo cancellato. [Snoppet ERD] (http://i.imgur.com/l6cdCVe.png). –

3

Sulla base di link nella risposta di Joe, ho capito questo approccio:

public void Application_PostRequestHandlerExecute(object sender, EventArgs e) 
{ 
    UpdateSessionCookieExpiration(); 
} 

/// <summary> 
/// Updates session cookie's expiry date to be the expiry date of the session. 
/// </summary> 
/// <remarks> 
/// By default, the ASP.NET session cookie doesn't have an expiry date, 
/// which means that the cookie gets cleared after the browser is closed (unless the 
/// browser is set up to something like "Remember where you left off" setting). 
/// By setting the expiry date, we can keep the session cookie even after 
/// the browser is closed. 
/// </remarks> 
private void UpdateSessionCookieExpiration() 
{ 
    var httpContext = HttpContext.Current; 
    var sessionState = httpContext?.Session; 

    if (sessionState == null) return; 

    var sessionStateSection = ConfigurationManager.GetSection("system.web/sessionState") as SessionStateSection; 
    var sessionCookie = httpContext.Response.Cookies[sessionStateSection?.CookieName ?? "ASP.NET_SessionId"]; 

    if (sessionCookie == null) return; 

    sessionCookie.Expires = DateTime.Now.AddMinutes(sessionState.Timeout); 
    sessionCookie.HttpOnly = true; 
    sessionCookie.Value = sessionState.SessionID; 
} 

Questo codice può essere inserito nel Global.asax.cs.

+0

questo sembra funzionare per me :) –

1

La risposta di Tom ha funzionato quasi per me, tranne che per il cast del cookie in una variabile e l'impostazione delle sue proprietà. Ho dovuto impostare le proprietà dell'oggetto direttamente in questo modo:

HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Expires = expiryDate; 
HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].HttpOnly = true; 
HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Value = sessionState.SessionID; 

ho ancora gettato il cookie in una variabile per verificare se si tratta di nulla, e restituire in caso affermativo.

Problemi correlati