ASP.NET Forms身份验证的授权安全性

时间:2010-05-18 10:24:51

标签: asp.net asp.net-mvc security forms-authentication authorization

我在ASP.NET MVC网站上使用Forms身份验证,我在AuthCookie中存储用户帐户登录名,如下所示:

FormsAuthentication.SetAuthCookie(account.Login, false);

我想问一下,客户端的用户是否有可能以某种方式设法在AuthCookie中更改他的登录名,因此他将被模仿为具有更高权限的人,并被授权执行比他通常更多的操作应该有。另外最好保存在此cookie用户帐户登录名或用户帐号ID中吗?

3 个答案:

答案 0 :(得分:4)

cookie将在服务器端加密和解密,因此除非用户可以破解加密密钥,否则他或她将无法执行此操作。

只要您存储的信息唯一标识您的用户,选择该信息的内容完全取决于特定应用程序的要求。

答案 1 :(得分:2)

不,这是不可能的(好吧,理论上可能,但在实践中它是不可行的)。身份验证cookie的值已加密,因此用户无法篡改它。最好将(唯一)登录名存储在身份验证cookie中,因为在恢复IIdentity对象(HttpContext.Current.User)时,会使用传递给SetAuthCookie的值对于Name的{​​{1}}属性。例如,如果您使用IIdentity,则会显示Name属性,因此,LoginStatusControl属性的值对用户有意义。

答案 2 :(得分:1)

Cookie已加密,因此很有可能。但仍然。

不止一种财产方法

如果您想让您的安全性更加严格,您可以保存用户名以及用户ID或其他一些无法从用户名中猜到的数据。这些组合使它更安全,因为如果你猜一个人更难猜测其他人并使用它们的正确组合。 IE浏览器。如果您猜测其他用户的电子邮件/用户名,则猜测相同用户的ID会更难,因为它们不相关。因此,您组合的无关属性越多,获得正确组合所需的步骤就越多。

登录安全令牌方法

您可以使用此方案中描述的替代方法:

  1. 用户登录。
  2. 生成随机安全登录令牌,该令牌可以是随机长度,并定义了一些最小长度,并将其保存在数据存储中的用户。这可能不是问题,而其他数据存储在登录中非常常见,例如LastLogonDate信息。
  3. 使用此令牌并将其保存在cookie中,而不是用户名或其他信息。
  4. 如果用户注销,请清除数据存储中的登录安全令牌
  5. 用户再次登录...返回1并再次创建新令牌并在此会话中使用它。
  6. 这样,从长远来看,它会使它更安全,因为这些信息会在每次登录时发生变化,如果用户手动注销,您可以随时从商店中清除该令牌,因此根本无法注入别人的身份。这确实使得使用永久性cookie变得更加复杂,但它仍然可以完成。

    此方法不是防弹,但它提供了额外的安全级别,可以在一个帐户遭到入侵时反复阻止同一次攻击。而且,当一个帐户被泄露时,并不意味着其他帐户也可以。如果您的安全令牌足够长,那么在您的网站上发起暴力攻击会更加困难,并且在执行此类攻击时,安全令牌会发生变化,因此它肯定会更安全。