我应该在FormsAuthentication Ticket中存储什么数据

本文关键字:存储 什么 数据 Ticket FormsAuthentication 我应该 | 更新日期: 2023-09-27 18:09:11

我需要存储用户的朋友列表,这样我就可以在每个页面中使用它(而不需要每次都进行数据库查询)。

我考虑过SessionState,但我认为这将是沉重的,因为数据库是巨大的。

所以我需要知道使用FormsAuthenticationTicket是正确的方法吗?或者我也应该使用HttpOnly饼干吗?

我应该在FormsAuthentication Ticket中存储什么数据

FormsAuthenticationTicket

您可以通过以下方式在FormsAuthenticationTicket中存储自定义数据:

string userData = "john smith;jane doe;bill murray";
HttpCookie cookie = FormsAuthentication.GetAuthCookie(user.UserName, true);
// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
// Create a new FormsAuthenticationTicket that includes the custom user data
var newTicket = new FormsAuthenticationTicket(ticket.Version,
                                              ticket.Name,
                                              ticket.IssueDate,
                                              ticket.Expiration,
                                              true,
                                              userData);

但是我会非常小心你在cookie中包含什么样的数据。有一个安全问题,如果你存储了太多的数据,那么你就有可能创建一个无效的cookie。另外,每次请求时都会向服务器发送cookie。这只会增加请求的大小。

IIRC有4KB的大小限制(最大cookie大小)。因此,您可以在cookie中存储的数据量当然是有限的。因为表单认证cookie已经包含了用户数据之外的数据,并且是加密的,所以可用的存储限制甚至更低。

我只会将它用于每个请求所需的非常小的信息片段。当然不是那些可以增长的数据,比如朋友列表。而不是标识符,我可以在服务器上使用它来查找一些东西。即使cookie被解密了,这些值也没有意义。

会话状态

我不会把这样的数据存储在用户的电脑上。通过这种方式,这些数据将分布在他使用的每台PC/浏览器上。如果您希望避免数据库往返,那么这将是缓存的主要候选。

老实说,我会将好友列表存储在会话状态中。当日志记录器登录时,检索一次好友列表并将其存储在会话中。当好友列表更新时,只需更新会话数据即可。然后,每个后续请求都可以从会话状态中检索用户的好友列表。

但是显然你不想把它存储在会话中?可能是调查会话状态提供程序是否可以更改的好时机。例如,使用AppFabric缓存集群来存储会话状态。这种方式比默认的InProc或StateServer模式更容易扩展。

例如,您可以为数据设置一个小时的过期时间。超时后,好友列表失效,在会话中不再可用。您需要再次从数据库中检索(更新过的)列表。但是,这样每小时只执行一次查询。

但是在会话状态中存储一个简单的好友列表肯定不是一个大问题。你还在里面放了什么?当然不是整个数据库

您可以尝试使用SqlDependency存储到缓存对象中。
例如,您正在缓存以下查询的结果(这是一个简单的查询,我相信sqldependency会喜欢它),并且您还可以从中创建朋友"图形"。

select u.UserId, u.FirstName, u.LastName, f.FriendId
from Users u
left join Friends f on f.UserId = u.UserId

如果你正在更改好友列表,删除用户等,那么缓存是无效的,你不需要担心从哪里更改它,从一个单独的应用程序,如admin/cms或从Management Studio

所以,基本上你在应用程序内存中有一个单一的朋友图,每个用户从他们的会话中访问它非常快。

管理cookie中的数据非常困难,实际上我无法想象您将如何确保cookie中的好友列表与数据库中的好友列表相同。