我在ASP.NET MVC网站上使用Forms身份验证,我在AuthCookie中存储用户帐户登录名,如下所示:
FormsAuthentication.SetAuthCookie(account.Login, false);
我想问一下,客户端的用户是否有可能以某种方式设法在AuthCookie中更改他的登录名,因此他将被模仿为具有更高权限的人,并被授权执行比他通常更多的操作应该有。另外最好保存在此cookie用户帐户登录名或用户帐号ID中吗?
答案 0 :(得分:4)
cookie将在服务器端加密和解密,因此除非用户可以破解加密密钥,否则他或她将无法执行此操作。
只要您存储的信息唯一标识您的用户,选择该信息的内容完全取决于特定应用程序的要求。
答案 1 :(得分:2)
不,这是不可能的(好吧,理论上可能,但在实践中它是不可行的)。身份验证cookie的值已加密,因此用户无法篡改它。最好将(唯一)登录名存储在身份验证cookie中,因为在恢复IIdentity
对象(HttpContext.Current.User
)时,会使用传递给SetAuthCookie
的值对于Name
的{{1}}属性。例如,如果您使用IIdentity
,则会显示Name
属性,因此,LoginStatusControl
属性的值对用户有意义。
答案 2 :(得分:1)
Cookie已加密,因此很有可能。但仍然。
如果您想让您的安全性更加严格,您可以保存用户名以及用户ID或其他一些无法从用户名中猜到的数据。这些组合使它更安全,因为如果你猜一个人更难猜测其他人并使用它们的正确组合。 IE浏览器。如果您猜测其他用户的电子邮件/用户名,则猜测相同用户的ID会更难,因为它们不相关。因此,您组合的无关属性越多,获得正确组合所需的步骤就越多。
您可以使用此方案中描述的替代方法:
LastLogonDate
信息。这样,从长远来看,它会使它更安全,因为这些信息会在每次登录时发生变化,如果用户手动注销,您可以随时从商店中清除该令牌,因此根本无法注入别人的身份。这确实使得使用永久性cookie变得更加复杂,但它仍然可以完成。
此方法不是防弹,但它提供了额外的安全级别,可以在一个帐户遭到入侵时反复阻止同一次攻击。而且,当一个帐户被泄露时,并不意味着其他帐户也可以。如果您的安全令牌足够长,那么在您的网站上发起暴力攻击会更加困难,并且在执行此类攻击时,安全令牌会发生变化,因此它肯定会更安全。