asp.net中User.Identity中的Ticket.UserData的安全性如何

asp.net中User.Identity中的Ticket.UserData的安全性如何,asp.net,cookies,forms-authentication,Asp.net,Cookies,Forms Authentication,我的网站使用ASP.NET的表单身份验证,我正在将特定于用户的信息插入身份验证票证/cookie的UserData部分。因为用户数据在身份验证票证中,所以它是这样加密的 authCookie.Value = FormsAuthentication.Encrypt(newTicket); 现在我不太担心数据在这一点上被泄露,因为它是加密的。但是我注意到数据是以这样的未加密形式提供的 FormsIdentity fid = User.Identity as FormsIdentity; strin

我的网站使用ASP.NET的表单身份验证,我正在将特定于用户的信息插入身份验证票证/cookie的UserData部分。因为用户数据在身份验证票证中,所以它是这样加密的

authCookie.Value = FormsAuthentication.Encrypt(newTicket);
现在我不太担心数据在这一点上被泄露,因为它是加密的。但是我注意到数据是以这样的未加密形式提供的

FormsIdentity fid = User.Identity as FormsIdentity;
string plainTextUserData = fid.Ticket.UserData;
数据本身并不太重要。即使别人能看到,我也没问题。但我不能允许人们劫持这些信息并开始将其作为自己的信息使用。例如,我不希望一个用户以另一个用户的身份登录(基于UserData中包含的userID)

这是我必须担心的事情吗

编辑1: 我想这样做的原因是,我可以停止使用会话,只使用cookies和Ticket.UserData

编辑2:
Ticket.UserData中的数据没有变化。一旦用户登录,它就会保持不变。

您可能不必担心

如果数据是敏感的(例如,美国的社会安全号码),那么您可能应该避免将其与FormsAuth罚单一起发送,即使它是加密的,因为作恶者总是会发动新的攻击


但是,我必须问:您已经可以为每个票据(用户名)存储一个标识符,那么为什么不将所有其他数据保存在数据库中呢?

它与身份验证票据一样安全。因为您使用它的目的非常相同,所以不用担心


我需要更多关于某些页面的数据 取决于用户的行为,对吗 现在我正在使用会话,但现在我想要 把所有的东西都变成饼干。 数据不多,所以我想 可以把所有的东西都装进 验证票据/cookie

@jorsh1基于您对@Portman的推荐,Ticket.UserData不是存储更改数据的地方。您不希望在从一个页面转到另一个页面时一直重新创建身份验证票证

将会话数据与会话服务或Sql Server一起使用。如果您不想在会话中使用该数据,并且该数据较小且不敏感,请使用cookie。(*)

使用UserData的MS canonical示例是存储角色列表之类的内容,以便您可以说“我是否认为此用户是管理员”之类的内容,但如果是管理员角色之类的内容,您可能会在隐式信任cookie中的内容之前点击数据库进行检查

字符串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);
另一个应用程序无法解码此票证,除非它知道解密密钥或它是强制执行的。如果你对应用程序进行负载平衡或使用web gardens

*我不赞成在会话中存储数据。通常有另一种方法来保存这些数据


[编辑]我使用会话的目的:

我经常做的唯一一件事就是在基于会话服务器的会话中存储用户关键数据的精简版本。不过,我们会透明地加载这些数据,并确保不会重复记录单中的内容

这样我们就不会暴露cookie中的任何敏感信息,也不依赖会话。我们还设置了积极的会话回收。再加上会话中存储的少量数据,会话不会给我们带来问题,因为只有一段代码知道会话中的内容,我们可以轻松地重构它


对于其他任何事情,会话都是有害的。我更喜欢在需要它的页面中维护viewstate,或者只是在数据库中保留临时状态。

根据用户的操作,我需要某些页面上的更多数据。目前我正在使用会话,但现在我想将所有内容都转移到cookie中。数据不多,所以我想我可以把所有东西都放进auth ticket/cookiethanks中,以供评论Robert。正如你所知,一旦用户登录,UserData中的数据就不会改变。它是电子邮件、内部用户ID、用户名等。我想知道,你个人用什么来代替会话?我自己开始讨厌会话了。