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

5

我正在使用ASP.NET MVC网站中的表单身份验证,并将用户帐户登录名存储在AuthCookie中,如下所示:

FormsAuthentication.SetAuthCookie(account.Login, false);

我想问一下,客户端用户是否有可能通过某种方式更改他在AuthCookie中的登录名,从而冒充具有更高权限的用户,并被授权执行比他正常应该拥有的更多操作。另外,在这个cookie中保存用户帐户登录名还是用户帐户ID号更好?

3个回答

4

Cookie将在服务器端进行加密和解密,因此除非用户能够破解加密密钥,否则他或她将无法这样做。

只要存储的信息可以唯一地标识您的用户,那么选择哪些信息完全取决于特定应用程序的要求。


2
不可能(理论上可能,但在实践中不可行)。认证 cookie 的值是加密的,因此用户无法篡改它。将(唯一的)登录名存储在认证 cookie 中是一个好主意,因为当恢复 IIdentity 对象 (HttpContext.Current.User) 时,会使用你传递给 SetAuthCookie 的值作为 IIdentityName 属性的值。例如,如果使用 LoginStatusControl,则会显示 Name 属性,因此让 Name 属性的值对用户有意义是个好主意。请注意保留 html 标签。

那是个很好的观点,但在我的场景中,我有一个完全基于 AJAX 的应用程序,在第一次请求期间只加载一次登录状态,并且每个 AJAX 请求都基于用户帐户 ID 加载模块授权权限,因此当我使用ID而不是名称时,在每个 AJAX 请求中,我将节省一次额外的内部联接。 - yojimbo87

1

Cookie是加密的,所以被破解的机会相当小。但还是有可能的。

多属性方法

如果您想让安全性更加严格,可以保存用户名以及用户ID或其他无法从用户名中猜测的数据。这些组合使其更安全,因为如果您可以猜测其中一个,那么猜测其他的就更难,并使用它们的正确组合。例如,如果您猜测到其他用户的电子邮件/用户名,那么猜测同一用户的ID就更困难,因为它们没有关联。因此,您结合的不相关属性越多,获取正确组合所需的步骤就越多。

登录安全令牌方法

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

  1. 用户登录。
  2. 生成一个随机的安全登录令牌,可以是随机长度,并定义一些最小长度,然后将其保存到数据存储中与用户相关联。这可能不是问题,因为在登录时通常还会存储其他数据,如LastLogonDate信息。
  3. 使用此令牌并将其保存在cookie中,而不是用户名或其他信息。
  4. 如果用户注销,则从数据存储中清除登录安全令牌。
  5. 用户再次登录... 回到 1 并创建一个新令牌,然后在此会话中使用它。

这样做可以使其在长期内更加安全,因为每次登录时都会更改这些信息,如果用户手动注销,则始终可以从存储器中清除该令牌,因此无法注入其他人的身份。 虽然这使得使用永久 cookie 有点复杂,但仍然可以完成。

这种方法并不是百分之百可靠的,但它提供了额外的安全级别,可以防止同一账户被攻击多次。而且,即使一个账户被攻击,也不意味着其他账户也会受到影响。如果您的安全令牌足够长,那么对您的网站进行暴力攻击将更加困难,而在执行此类攻击时,安全令牌将会更改,因此绝对更安全。


如果您担心Cookie安全受到威胁,那么您最不想做的事情就是采用多属性方法,并在其中包含足够的信息以重新对用户进行身份验证... - David M
@David M:只要信息不透露任何个人信息(假设用户名不是个人信息),你就可以放心使用。IDs/SIDs/GUIDs 是一个好的选择,特别是如果你使用 SIDs 或 GUIDs,因为它们通常不是连续的数字,而且比通常的数字更长,所以更难猜测或暴力破解。你也可以包括联系方式的 IDs/SIDs/GUIDs,这样你仍然不会泄露任何信息。当某些 cookie 发送到服务器时,所有这些都必须进行检查,而服务器没有缓存用户数据。我想这种组合是一个很好的方法。 - Robert Koritnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接