2010-07-27 40 views
8

Sto cercando indicazioni in merito ai cookie in ASP.Net MVC (o semplicemente alla gestione dei cookie in generale). Ho archiviato le informazioni di autenticazione sugli utenti che si autenticano tramite un accesso al modulo in un cookie. Funziona benissimo, ma ora devo memorizzare un po 'più di informazioni nel cookie. Queste informazioni aggiuntive non sono realmente "correlate all'autenticazione", quindi sono riluttante a memorizzarle nel ticket di autenticazione. Esiste una pratica migliore per archiviare informazioni extra. È possibile impostare più cookie (e in tal caso una buona/cattiva pratica)? Altre cose che dovrei prendere in considerazione qui?Buone pratiche dei cookie MVC di ASP.Net

Ecco il codice corrente sto usando per impostare il ticket di autenticazione e avvolgerlo in un cookie:

private HttpCookie GetAuthCookie(AuthToken authToken) 
{ 
    var authTokenXml = serializationService.Serialize(authToken); 
    var authCookieString = FormsAuthentication.Encrypt(
     new FormsAuthenticationTicket(
      0, 
      Keys.AuthToken, 
      DateTime.Now, 
      DateTime.Now.AddMinutes(AppSettings.SessionTimeoutMinutes), 
      true, 
      authTokenXml)); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, authCookieString) 
        { 
         Expires = DateTime.Now.AddDays(AppSettings.AuthCookieExpireDays) 
        }; 
    return cookie; 
} 

risposta

2

C'è un limite di dimensione per quanto è grande un cookie può essere, 4096 byte. Dopo questo, potrebbe essere necessario dividere i dati in diversi cookie se si desidera continuare a memorizzare nei cookie. Ovviamente ora hai la complessità aggiuntiva di leggere da tutti per ricostruire il tuo biglietto di autenticazione + i dati e, se un cookie non è stato inviato con il resto, potrebbe avere delle conseguenze disastrose.

Hai guardato utilizzando un negozio di sessioni diverso? Questo è effettivamente quello che stai usando il cookie come qui e, a meno che non sia correlato all'autenticazione e debba essere disponibile nella pipeline di elaborazione prima che la sessione sia accessibile, sarei propenso a metterlo in sessione. È possibile utilizzare un archivio di sessione non elaborato come un database se non si desidera archiviare la sessione in corso.

+0

Sì, ho considerato l'utilizzo dello stato sessione SQL Server come alternativa all'approccio cookie. I dati extra che devo memorizzare sono piccoli (probabilmente 20 caratteri), quindi non dovrebbe aggiungere troppi sovraccarichi sul filo o in termini di dimensioni dei cookie. Speravo di evitare l'uso di un database solo per memorizzare queste informazioni aggiuntive, a meno che non sia davvero la pratica migliore, ed è per questo che ho posto la domanda qui. Grazie per il vostro feedback – Paul

+0

se ha solo 20 caratteri, probabilmente non sta facendo alcun danno nel cookie. Se è così piccolo, usare la sessione in proc potrebbe anche essere una buona idea. Forse provare in entrambi i modi e vedere quale è preferibile? –

1

Non si deve inserire nulla se non i dati di autenticazione nel cookie di autenticazione. L'uso dei cookie da parte di Asp.net è praticamente lo stesso di qualsiasi piattaforma di programmazione per il web. Puoi impostare tutti i cookie che vuoi e archiviarli in qualsiasi modo desideri. Alcuni esempi:

http://www.cookiecentral.com/faq/

http://stephenwalther.com/blog/archive/2008/07/08/asp-net-mvc-tip-15-pass-browser-cookies-and-server-variables-as-action-parameters.aspx

http://www.asp.net/general/videos/read-write-and-delete-cookies-in-aspnet

12

Regola generale: negozio nel cookie solo il minimo (di solito questo è l'id utente) e usare questo minimo per andare a prendere il resto dal tuo archivio dati ogni volta che ne hai bisogno. Se sei soddisfatto della performance, puoi smettere di leggere.

Se ci si rende conto che ci sono troppe query sul datastore, è possibile utilizzare la sessione o memorizzare nella cache i risultati delle query.

Problemi correlati