2010-07-27 8 views
8

Ich suche nach Anleitungen zu Cookies in ASP.Net MVC (oder einfach nur zur Cookie-Handhabung im Allgemeinen). Ich habe Authentifizierungsinformationen über Benutzer gespeichert, die sich über ein Formular-Login in einem Cookie authentifizieren. Das funktioniert großartig, aber ich muss jetzt ein wenig mehr Informationen im Cookie speichern. Diese zusätzlichen Informationen sind nicht wirklich "authentifizierungsbezogen", daher zögere ich, sie im Authentifizierungsticket zu speichern. Gibt es eine bessere Vorgehensweise zum Speichern zusätzlicher Informationen? Ist es möglich, mehrere Cookies zu setzen (und wenn ja, ist das eine gute/schlechte Praxis)? Andere Dinge, die ich hier in Betracht ziehen sollte?Best Practices für ASP.Net MVC-Cookies

Hier ist der aktuelle Code Ich bin mit dem Authentifizierungsticket setzen und es in einem Cookie wickeln:

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; 
} 

Antwort

2

Es gibt eine Größenbeschränkung, wie groß ein Cookie sein kann, 4096 Bytes. Danach müssen Sie die Daten möglicherweise in mehrere Cookies aufteilen, wenn Sie weiterhin in Cookies speichern möchten. Offensichtlich haben Sie jetzt die zusätzliche Komplexität, alles zu lesen, um Ihr Authentifizierungsticket + Daten zu rekonstruieren, und wenn ein Cookie nicht mit dem Rest gesendet wurde, kann dies einige schlimme Folgen haben.

Haben Sie einen anderen Sitzungsspeicher verwendet? Das ist effektiv, was Sie hier verwenden, und wenn es nicht mit der Authentifizierung zusammenhängt und in der Verarbeitungspipeline verfügbar sein muss, bevor auf die Sitzung zugegriffen werden kann, würde ich geneigt sein, darauf zu achten, dies in die Sitzung zu bringen. Sie können einen Out-of-Process-Sitzungsspeicher wie eine Datenbank verwenden, wenn Sie die Sitzung nicht in Arbeit speichern möchten.

+0

Ja, ich habe erwogen, den SQL Server-Sitzungsstatus als Alternative zum Cookie-Ansatz zu verwenden. Die zusätzlichen Daten, die ich speichern muss, sind klein (wahrscheinlich 20 Zeichen), daher sollte es nicht zu viel Overhead auf der Leitung oder in Bezug auf die Cookie-Größe hinzufügen. Ich hoffte irgendwie zu vermeiden, eine Datenbank zu verwenden, nur um diese zusätzlichen Informationen zu speichern, es sei denn, es ist wirklich die bessere Praxis, und deshalb habe ich die Frage hier gestellt. Vielen Dank für Ihr Feedback. – Paul

+0

Wenn es nur 20 Zeichen sind, schadet es wahrscheinlich nicht im Cookie. Wenn es so klein ist, könnte die Verwendung der in-proc-Sitzung auch gut passen. Vielleicht versuchen beide Wege und sehen, was vorzuziehen ist? –

1

Sie sollten nur Authentifizierungsdaten in den Authentifizierungscookie eingeben. Die Verwendung von Cookies in Asp.net entspricht weitgehend der Programmierung in einer Web-Plattform. Sie können so viele Cookies setzen, wie Sie möchten, und darin speichern, was Sie wollen. Einige Beispiele:

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

Daumenregel: Laden im Cookie nur das Minimum (in der Regel ist dies die Benutzer-ID) und dieses Minimum verwenden, den Rest zu holen von Ihrem Datenspeicher jedes Mal, wenn Sie es brauchen. Wenn Sie mit der Leistung zufrieden sind, können Sie aufhören zu lesen.

Wenn Sie feststellen, dass Ihr Datenspeicher zu viele Abfragen enthält, können Sie die Ergebnisse Ihrer Abfragen mit der Sitzung oder zwischenspeichern.