我的网站使用ASP.NET的表单身份验证,我将用户特定的信息插入到身份验证票证/ cookie的UserData部分.由于UserData位于身份验证票据内,因此它是加密的
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
现在我不太担心此时数据被泄露,因为它已加密.但我注意到这些数据是以未加密的形式提供的
FormsIdentity fid = User.Identity as FormsIdentity; string plainTextUserData = fid.Ticket.UserData;
数据本身并不太重要.即使别人能看到它,我仍然可以.但我不能让人们劫持这些信息,并开始将其作为自己的信息使用.例如,我不希望一个用户登录,假装是一个不同的用户(基于UserData中包含的用户ID)
这是我要担心的事吗?
我想这样做的原因是我可以停止使用会话,只使用cookie和Ticket.UserData
Ticket.UserData中的数据不会更改.一旦用户登录,它就是常量.
我需要在某些页面上有更多数据,具体取决于用户的操作.现在我正在使用会话,但现在我想将所有内容都转移到cookie中.这不是很多数据所以我想我可以把所有东西都带回到auth票/ cookie中
@ jorsh1基于对@Portman的推荐,Ticket.UserData不是存储更改数据的地方.从一个页面转到另一个页面时,您不希望始终重新创建身份验证票证.
将会话数据与会话服务或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);
另一个应用程序无法解码此票证,除非它知道解密密钥或它是暴力强制的.如果您对应用程序进行负载平衡或使用Web园,您甚至需要保持密钥同步.
*我不支持在会话中存储东西.通常还有另一种方法来保存这些数据.
[编辑]我使用的会话:
我经常发现自己做的唯一事情是在基于会话服务器的会话中存储用户关键数据的精简版本.然而,我们使其透明加载,并确保不重复票证中的内容.
这样我们就不会暴露任何敏感的cookie,我们也不依赖于会话.我们还设置积极的会话回收.结合会话中存储的少量数据,会话不会给我们带来问题,因为只有一段代码知道会话中的什么,我们可以轻松地重构它.
对于其他任何事情,会议是邪恶的.我更喜欢在需要它的页面中维护viewstate,或者只是在数据库中保留临时状态.