26

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

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

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

在 auth cookie 的用户数据部分中编码这些数据的好方法是什么?我在考虑序列化,但这可能是矫枉过正。我会以错误的方式解决这个问题吗?

4

6 回答 6

38

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

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

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

编辑:

博客不再存在,可以在此处的网络存档中找到存档。

来自博客的总结:

获取现有的 cookie 和 auth 票

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);
于 2011-07-07T00:19:30.670 回答
10

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

于 2009-07-03T17:38:57.050 回答
3

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

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

于 2009-07-01T17:42:37.120 回答
3

如果您已经有了一个包含配置文件信息的用户表,为什么不使用自定义配置文件提供程序来连接它。

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

于 2009-07-01T21:03:33.717 回答
2

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

于 2009-07-01T17:41:38.337 回答
0

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

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

ASP.NET 有一个每个请求缓存 HttpContext.Current.Items 和一个应用程序域缓存 HttpContext.Current.Cache,我认为您正在寻找 HttpContext.Current.Cache 在这种情况下。

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

于 2012-10-24T02:06:50.290 回答