我正在使用ASP.NET MVC网站中的表单身份验证,并将用户帐户登录名存储在AuthCookie中,如下所示:
FormsAuthentication.SetAuthCookie(account.Login, false);
我想问一下,客户端用户是否有可能通过某种方式更改他在AuthCookie中的登录名,从而冒充具有更高权限的用户,并被授权执行比他正常应该拥有的更多操作。另外,在这个cookie中保存用户帐户登录名还是用户帐户ID号更好?
我正在使用ASP.NET MVC网站中的表单身份验证,并将用户帐户登录名存储在AuthCookie中,如下所示:
FormsAuthentication.SetAuthCookie(account.Login, false);
我想问一下,客户端用户是否有可能通过某种方式更改他在AuthCookie中的登录名,从而冒充具有更高权限的用户,并被授权执行比他正常应该拥有的更多操作。另外,在这个cookie中保存用户帐户登录名还是用户帐户ID号更好?
Cookie将在服务器端进行加密和解密,因此除非用户能够破解加密密钥,否则他或她将无法这样做。
只要存储的信息可以唯一地标识您的用户,那么选择哪些信息完全取决于特定应用程序的要求。
IIdentity
对象 (HttpContext.Current.User
) 时,会使用你传递给 SetAuthCookie
的值作为 IIdentity
的 Name
属性的值。例如,如果使用 LoginStatusControl
,则会显示 Name
属性,因此让 Name
属性的值对用户有意义是个好主意。请注意保留 html 标签。Cookie是加密的,所以被破解的机会相当小。但还是有可能的。
如果您想让安全性更加严格,可以保存用户名以及用户ID或其他无法从用户名中猜测的数据。这些组合使其更安全,因为如果您可以猜测其中一个,那么猜测其他的就更难,并使用它们的正确组合。例如,如果您猜测到其他用户的电子邮件/用户名,那么猜测同一用户的ID就更困难,因为它们没有关联。因此,您结合的不相关属性越多,获取正确组合所需的步骤就越多。
您可以使用本方案中描述的替代方法:
LastLogonDate
信息。这样做可以使其在长期内更加安全,因为每次登录时都会更改这些信息,如果用户手动注销,则始终可以从存储器中清除该令牌,因此无法注入其他人的身份。 虽然这使得使用永久 cookie 有点复杂,但仍然可以完成。
这种方法并不是百分之百可靠的,但它提供了额外的安全级别,可以防止同一账户被攻击多次。而且,即使一个账户被攻击,也不意味着其他账户也会受到影响。如果您的安全令牌足够长,那么对您的网站进行暴力攻击将更加困难,而在执行此类攻击时,安全令牌将会更改,因此绝对更安全。