2

而不是使用 ASP.NET MVC 用户的系统,我只是使用会话,如下所示:

当他登录(用户名+密码)时,我从数据库中获取相应的用户并设置:

Session["UserId"] = fetchedUser.UserId;

然后,我总是检查他是否登录:

if (Session["UserId"] != null && ...)

问题是,如果有人从登录用户那里复制 ASP.NET_SessionId 的值(例如:用户去洗手间,坐在他旁边的同事用 chrome inspector 检查他的 cookie),那么他将能够创建一个 cookie在他的计算机中并充当该用户。

Chrome 的检查器

我的问题是:

  1. 如果会话 ID 保存在 cookie 中,为什么会话比 cookie 更安全?
  2. 我可以让它更安全(并继续使用会话)吗?
  3. 内部 ASP.NET 用户身份验证系统是如何做到的?
4

1 回答 1

8

不使用 Session 作为身份验证机制的主要原因是它可能使您的应用程序容易受到Session Fixation的攻击。例如,如果用户使用 HTTP 协议到达您的站点并接收到存储在ASP.NET_SessionIdcookie 中的会话 ID,则可能会出现问题。用户稍后可能会登录,即使您的登录页面可能在 HTTPS 下受到保护,会话令牌已经在 HTTP 下生成,这意味着它已经使用明文传输。

回答你的其他观点:

如果会话 ID 保存在 cookie 中,为什么会话比 cookie 更安全?

session中存储的数据是存储在服务器端的,因此攻击者更难篡改这些数据。所有 cookie 存储都是此数据的令牌,而不是数据本身。话虽如此,使用它仍然更安全,FormsAuthenticationProvider因为一旦登录完成而不是在会话开始时创建一个新的身份验证令牌,因为如上所述避免会话固定。

我可以让它更安全(并继续使用会话)吗?内部 ASP.NET 用户身份验证系统是如何做到的?

内置的提供程序已经适合目的,因此最好使用它而不是捏造另一种机制来满足您的要求。它也很容易扩展,因此您可以根据需要对其进行自定义。ASP.NET 用户身份验证创建加密票证并将其存储在 cookie 中,而不是存储对服务器端变量的引用:http: //support.microsoft.com/kb/910443

我还会提请您注意注销机制以及如何保护它。特别

调用 SignOut 方法只会删除表单身份验证 cookie。Web 服务器不存储有效和过期的身份验证票证以供以后比较。如果恶意用户获得有效的表单身份验证 cookie,这会使您的站点容易受到重放攻击。

此处的详细信息:http: //msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

此外,您可能希望在ASP auth cookie上设置“安全”标志,以防止 MITM 攻击者通过 HTTP 泄露它。

于 2013-08-06T10:20:05.430 回答