根据用户的操作,我需要在某些页面上提供更多数据。现在我正在使用会话,但现在我想将所有内容移到 cookie 中。这不是很多数据,所以我想我可以将所有内容搭载到身份验证票/cookie中
@jorsh1 基于您对@Portman 的推荐,Ticket.UserData 不是存储变化数据的地方。从一页转到另一页时,您不希望一直重新创建身份验证票证。
将 Session 数据与Session Service或Sql Server一起使用。如果您不希望会话中的数据,并且数据很小且不敏感,则使用 cookie。(*)
使用 UserData 的 MS 规范示例是存储角色列表之类的内容,以便您可以说“我认为此用户是管理员吗”之类的内容,但如果它类似于管理员角色,您可能会点击数据库进行检查在您暗中信任 cookie 中的内容之前。
string plainTextUserData = fid.Ticket.UserData;
这仅在您的应用程序中有效,因为 Asp.Net 已经为您解密了票证。但是,如果要设置数据 IIRC,则需要重新创建并重新附加表单身份验证 cookie。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
currentTicket.Version + 1,
currentUser.UserName,
now,
now.Add(formsAuthentication.Timeout),
false,
"new user data string",
FormsAuthentication.FormsCookiePath);
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
hash);
Response.Cookies.Add(cookie);
除非它知道解密密钥或者它是暴力破解的,否则另一个应用程序无法解码此票证。如果您对应用程序进行负载平衡或使用网络花园,您甚至需要保持密钥同步。
* 我不支持在会话中存储东西。通常还有另一种方法来持久化这些数据。
[编辑] 我使用会话的目的:
我经常发现自己做的唯一一件事就是在基于会话服务器的会话中存储用户关键数据的精简版。然而,我们让它透明加载,并确保不要复制票证中的内容。
这样我们就不会在 cookie 中暴露任何敏感信息,也不会依赖 session。我们还设置了积极的会话回收。结合 session 中存储的少量数据,session 不会给我们带来问题,并且由于只有 1 段代码知道 session 中的内容,我们可以轻松地对其进行重构。
对于其他任何事情,会话都是邪恶的。我更喜欢在需要它的页面中维护视图状态,或者只是将临时状态保留在数据库中。