4

我的网站使用 ASP.NET 的表单身份验证,并且我将用户特定信息插入到身份验证票证/cookie 的 UserData 部分。由于 UserData 在身份验证票内,因此像这样加密

authCookie.Value = FormsAuthentication.Encrypt(newTicket);

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

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

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

这是我必须担心的事情吗?

编辑1:

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

编辑2:

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

4

3 回答 3

5

根据用户的操作,我需要在某些页面上提供更多数据。现在我正在使用会话,但现在我想将所有内容移到 cookie 中。这不是很多数据,所以我想我可以将所有内容搭载到身份验证票/cookie中

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

将 Session 数据与Session ServiceSql 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 中的内容,我们可以轻松地对其进行重构。

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

于 2009-02-19T02:03:53.167 回答
2

它与身份验证票证一样安全。由于您将它用于相同的目的,请不要担心。

于 2009-02-19T01:18:38.953 回答
1

可能不需要担心。

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

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

于 2009-02-19T01:14:24.500 回答