当他登录(用户名密码)时,我从数据库中获取相应的用户并设置:
Session["UserId"] = fetchedUser.UserId;
然后,我总是检查他是否登录:
if (Session["UserId"] != null && ...)
问题是,如果有人从登录用户复制ASP.NET_SessionId的值(例如:用户去卫生间,坐在他旁边的同事用铬检查员检查他的饼干),那么他将能够创建一个cookie在他的计算机中并充当该用户.
我的问题是:
>如果会话ID保存在cookie中,为什么会话比cookie更安全?
>我可以使这更安全(并继续使用会话)?
>内部ASP.NET用户身份验证系统如何实现?
解决方法
回答你的其他观点:
Why are sessions safer than cookies if the session id is saved in a
cookie?
存储在会话中的数据存储在服务器端,因此攻击者更难以篡改此数据.所有cookie存储都是此数据的标记,而不是数据本身.话虽如此,使用FormsAuthenticationProvider仍然更安全,因为这会在登录完成后创建新的身份验证令牌,而不是在会话启动时出于避免上述会话固定的原因.
Can I make this safer (and continue using session)? How does
internally ASP.NET User authetication system do it?
内置提供程序已经适合用途,因此最好使用它而不是捏造另一种机制来满足您的要求.它也很容易扩展,因此您可以根据自己的需要进行自定义. ASP.NET用户身份验证创建加密票证并将其存储在cookie中,而不是存储对服务器端变量的引用:http://support.microsoft.com/kb/910443
我还会提请你注意注销机制以及如何保护它.尤其
Calling the SignOut method only removes the forms authentication cookie. The Web server does not store valid and expired authentication tickets for later comparison. This makes your site vulnerable to a replay attack if a malicIoUs user obtains a valid forms authentication cookie.
详情:http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx
此外,您可能需要在ASP auth cookie上设置“secure” flag以防止它被MITM攻击者通过HTTP泄露.