ASP.Net MVC Cookie最佳实践

时间:2010-07-27 20:42:10

标签: asp.net-mvc cookies

我正在寻找关于ASP.Net MVC中的cookie的一些指导(或者只是一般的cookie处理)。我一直在存储有关通过cookie中的表单登录进行身份验证的用户的身份验证信息。这很好用,但我现在需要在cookie中存储更多信息。这些附加信息实际上并不是“与身份验证相关”,因此我对将其存储在身份验证票证中犹豫不决。是否有更好的存储额外信息的做法。是否可以设置多个cookie(如果这样做是好的/坏的做法)?我应该考虑其他事情吗?

以下是我用于设置身份验证票证并将其包装在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;
}

3 个答案:

答案 0 :(得分:12)

经验法则:仅在cookie中存储最小值(通常这是用户ID),并在每次需要时使用此最小值从数据存储区中获取剩余部分。如果您对表演感到满意,可以停止阅读。

如果您发现对数据存储区的查询过多,则可以使用会话或缓存查询结果。

答案 1 :(得分:2)

cookie的大小限制为4096字节。在此之后,如果要继续存储在cookie中,您可能需要将数据块化为多个cookie。显然,你现在增加了从所有人那里读取重建身份验证票据+数据的复杂性,如果一个cookie没有与其他人一起发送,则可能会产生一些可怕的后果。

您是否考虑过使用其他会话商店?这实际上就是你在这里使用cookie,除非它与身份验证有关,并且需要在会话可访问之前在处理管道中可用,我倾向于考虑将其放入会话中。如果不想在会话中存储会话,则可以使用进程外会话存储(如数据库)。

答案 2 :(得分:1)

您不应该在身份验证Cookie中添加任何身份验证数据。 Asp.net对cookie的使用与任何Web编程平台的使用情况大致相同。 您可以根据需要设置任意数量的cookie,并随意存储。 一些例子:

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