2010-07-27 242 views
8

我正在尋找關於在ASP.Net MVC(或只是一般的cookie處理)Cookie的一些指導。我一直在存儲有關通過cookie中的表單登錄進行身份驗證的用戶的身份驗證信息。這很好,但我現在需要在cookie中存儲更多信息。這些附加信息並非真正與「身份驗證相關」,因此我很猶豫是否將其存儲在身份驗證憑單中。有沒有更好的做法來存儲額外的信息。是否可以設置多個Cookie(如果是的話,這是一種好的/不好的做法)?我應該考慮的其他事情呢?ASP.Net MVC Cookies最佳實踐

下面是當前的代碼我使用設置驗證票和餅乾包裝它:

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

回答

2

有大小限制cookie可以多大,4096個字節。在此之後,如果想要繼續存儲Cookie,則可能需要將數據分塊爲多個Cookie。很顯然,現在你增加了從所有人那裏讀取重建身份驗證票據+數據的複雜性,並且如果一個cookie沒有與其他人一起發送,它可能會有一些可怕的後果。

你看過使用不同的會話存儲嗎?這就是你在這裏使用cookie的有效方法,除非它與認證相關,並且在會話可訪問之前需要在處理管道中可用,否則我傾向於將此置於會話中。如果不想將會話存儲在進程中,則可以使用進程外會話存儲庫(如數據庫)。

+0

是的,我一直在考慮使用SQL Server會話狀態作爲cookie方法的替代方案。我需要存儲的額外數據很少(可能是20個字符),所以它不應該在網絡或Cookie大小方面增加太多開銷。我有點希望避免使用數據庫來存儲這些額外的信息,除非它確實是更好的做法,這就是爲什麼我在這裏問這個問題的原因。感謝您的反饋意見。 – Paul 2010-07-27 21:00:04

+0

如果只有20個字符,它可能不會對cookie造成任何傷害。如果它是這麼小,使用proc會話也可能是一個很好的選擇。也許嘗試兩種方式,看看哪個更好? – 2010-07-27 21:16:14

1

您不應該在身份驗證Cookie中添加任何身份驗證數據。 Asp.net對cookie的使用與任何web編程平臺中的使用大致相同。 您可以根據自己的喜好設置任意數量的曲奇,並隨時隨地儲存在曲奇中。 一些例子:

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

經驗法則:儲存在cookie中只有最小的(這通常是用戶ID),並使用這一最低去取剩下的從你的數據存儲每次你需要它。如果您對錶演滿意,您可以停止閱讀。

如果您意識到對數據存儲的查詢太多,則可以使用會話或緩存查詢結果。