ASP.Net在Auth Cookie中存储用户数据

时间:2009-07-01 17:37:10

标签: asp.net authentication forms-authentication membership

我想在auth cookie的用户数据部分中存储一些数据,如用户昵称和用户ID(表主键)。我这样做的原因是在浏览器关闭时保留这些数据,而无需用户重新登录。

修改:哎呀!意识到我没有很好地解释自己。我不是试图根据他们的cookie重新验证用户。 ASP.Net的会员系统已经 已经认证了 - 这部分没问题。我的问题是,如果我想显示用户的昵称,例如,我必须触发另一个SQL查询,然后将其存储在会话中。我认为将这些信息存储在UserData部分的auth cookie中(再次,由ASP.Net创建的那个)是有意义的,这似乎是为此目的而创建的。

我不想使用配置文件,因为我有自己的用户表和配置文件数据,我需要一个轻量级的解决方案。

在auth cookie的用户数据部分对这些数据进行编码的好方法是什么?我在想序列化,但这可能有点过分。我是以错误的方式解决这个问题吗?

6 个答案:

答案 0 :(得分:36)

我在这里写了一篇关于如何做到这一点的深入教程:

http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/

这维护了加密和身份验证,并使用json将类序列化为UserData字段。

修改:

博客不再存在,可以找到档案on the web archive here

博客摘要:

获取现有的cookie和身份验证票

HttpResponse response = HttpContext.Current.Response;
bool rememberMe = true;
var cookie = FormsAuthentication.GetAuthCookie(name, rememberMe);
var ticket = FormsAuthentication.Decrypt(cookie.Value);

定义您的自定义数据(确保这可以序列化为json)

var userData = new YourUserClass(...);

使用您的数据和现有的身份验证票据设置

创建新的身份验证票证
var newTicket = new FormsAuthenticationTicket(ticket.Version, 
    ticket.Name, 
    ticket.IssueDate, 
    ticket.Expiration, 
    ticket.IsPersistent, 
    userData.ToJson(), //This is where you'd set your user data
    ticket.CookiePath);
var encTicket = FormsAuthentication.Encrypt(newTicket);

将自定义故障单设置为cookie并添加到响应

cookie.Value = encTicket;
response.Cookies.Add(cookie);

答案 1 :(得分:10)

显然我走在正确的轨道上:http://www.asp.net/learn/security/tutorial-03-vb.aspx(步骤4:步骤4:在故障单中存储其他用户数据)

答案 2 :(得分:3)

是。如果您在cookie中存储用户ID和登录,是什么阻止某人将他们的cookie更改为任何人的用户ID和登录?

您需要设置身份验证票证系统。基本上它是一个cookie值,当没有会话存在时会被检查。如果存在值,则针对应包含其用户ID的故障单表运行该值。如果您找到了票证,请为他们提供会话和新票证

答案 3 :(得分:3)

如果您已经有一个包含个人资料信息的用户表,为什么不用custom profile provider来加入它。

如果您想要另外一个如何实现此类内容的示例,您可以查看SQL Table Profile Provider

答案 4 :(得分:2)

也许你可以创建另一个cookie ......我个人不会弄乱auth cookie。

答案 5 :(得分:0)

在cookie中存储额外的用户数据意味着每次请求都会从客户端来回发送更大的cookie。

避免您担心的额外数据库命中的更好方法是在用户登录后将该数据缓存在内存中。

ASP.NET有一个每个请求缓存HttpContext.Current.Items和一个app域缓存HttpContext.Current.Cache,我想你在这个实例中寻找HttpContext.Current.Cache。

或者,如果您需要跨Web服务器(负载平衡的Web服务器)进行缓存,您可以查看第三方密钥值存储,如memcached,redis,velocity,ncache等。