asp.net中User.Identity中的Ticket.UserData有多安全

时间:2009-02-19 00:49:12

标签: asp.net cookies forms-authentication

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

authCookie.Value = FormsAuthentication.Encrypt(newTicket);

现在我并不太担心此时数据被泄露,因为它已加密。但我注意到数据是以未加密的形式提供的,如此

FormsIdentity fid = User.Identity as FormsIdentity;
string plainTextUserData = fid.Ticket.UserData;

数据本身并不太重要。即使别人能看到它,我仍然可以。但我不能让人们劫持这些信息,并开始将其作为自己的信息使用。例如,我不希望一个用户登录,假装是一个不同的用户(基于UserData中包含的用户ID

这是我要担心的吗?

编辑1:

我想这样做的原因是我可以停止使用会话并使用cookies和Ticket.UserData

编辑2:

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

3 个答案:

答案 0 :(得分:5)

  

我需要在某些页面上提供更多数据   取决于用户的行为。对   现在我正在使用会话,但现在我想要   将一切都移到cookie中。   这不是很多数据,所以我认为我   可以捎带一切进入   身份验证票/ 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);

另一个应用程序无法对此票证进行解码,除非它知道解密密钥或者是暴力强制的。如果您对应用程序进行负载平衡或使用网络花园,you even need to keep the keys in sync.

*我不支持在会话中存储内容。通常还有另一种方法来保存这些数据。


[edit]我使用的会话:

我经常发现自己做的唯一事情是在基于会话服务器的会话中存储用户关键数据的精简版本。然而,我们使其透明加载,并确保不重复票证中的内容。

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

除此之外,会议是邪恶的。我更喜欢在需要它的页面中维护viewstate,或者只是在数据库中保留临时状态。

答案 1 :(得分:2)

它与身份验证票一样安全。由于您出于同样的目的使用它,所以不要担心。

答案 2 :(得分:1)

可能不用担心。

如果数据是敏感的(例如,美国的社会安全号码),那么您应该避免使用FormsAuth票证发送它,即使它是加密的,因为恶意者总是会发出新的攻击。

但是,我不得不问:你已经为每个故障单(用户名)存储了一个标识符,那么为什么不将所有其他数据保存在数据库中呢?