FormsAuthentication:它安全吗?

时间:2011-02-08 16:02:26

标签: asp.net security cookies ssl forms-authentication

使用 FormsAuthentication 构建到 asp.net ,可以非常快速轻松地创建一个为经过身份验证的用户创建Cookie的登录系统:

FormsAuthentication.SetAuthCookie(uniqueUsername, false);

Web.Config 文件中的一些代码配对:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" timeout="30" defaultUrl="Dashboard.aspx" protection="All" />
</authentication>
<authorization>
  <deny users="?" />
</authorization>

这会将所有请求退回 Login.aspx ,直到用户获得批准并使用SetAuthCookie()方法调用创建Cookie。

这足够安全吗?
我使用的经验法则是我不会在客户端上存储他们没有发送给我的任何数据。所以我过去所做的就是保存cookie中使用的用户名和密码,然后对每个请求重新进行身份验证。

使用这种方法每次重新进行身份验证都会产生额外的开销,但这也意味着我没有在客户端上存储任何服务器数据。

我的担心
我担心的是,通过使用SetAuthCookie()方法调用,用户名存储在客户端计算机上。那么有人可能会破坏正在使用的加密并替换为另一个存储的用户名吗?

我认为我过于偏执,使用的加密类型和级别已经足够,但我认为我会就此主题获得一些专家意见。

3 个答案:

答案 0 :(得分:41)

  

所以我过去所做的就是保存cookie中使用的用户名和密码,然后对每个请求重新进行验证。

你应该使用这种方法。密码应存储在身份验证票证中。原因是如果身份验证票据被泄露,则攻击者拥有用户的密码。通过加密身份验证票证cookie可以减轻这种风险,但我认为您是以纯文本格式存储cookie。

  

我担心的是,通过使用SetAuthCookie()方法调用,用户名存储在客户端计算机上。那么有人可能会破坏正在使用的加密并替换为另一个存储的用户名吗?

正如Shiraz所说,如果你创建了一个持久性cookie,cookie只会持久存储在客户端机器上。 (SetAuthCookie的一个参数表示是否创建这样的cookie。

即使有人违反加密方案修改cookie以提供不同的用户名,他们也会遇到问题,因为身份验证票证也经过数字签名,这意味着ASP.NET可以检测cookie的内容是否已被修改。要伪造数字签名,攻击者需要知道服务器使用的盐,如果用户能够弄清楚这意味着他可以访问您的Web服务器的文件系统,那么现在您遇到了更大的问题。

另一件需要理解的是,身份验证票证有一个到期日,这会使票证的有效期有限。因此,即使有人要窃取用户的cookie,攻击者必须使用该被盗票证的时间也将根据您为表单身份验证系统指定的timeout值进行限制(默认为30分钟)。

总之,官方的ASP.NET表单身份验证系统将比单独的开发人员能够实现的安全性更加安全。开发人员应该努力使用表单身份验证系统,而不是出于各种原因推出他们自己的解决方案,包括更好的安全性,不必重新发明轮子,采用标准做法,因此加入团队的其他开发人员没有那么大的学习曲线以加快速度,等等。

有关表单身份验证系统的更多详细信息以及故障单的保护方式,各种<forms>配置设置的工作方式等等,请参阅:Forms Authentication Configuration and Advanced Topics

答案 1 :(得分:7)

关于你的思考过程的一些随机陈述,但是关于

  

所以我过去所做的就是坚持   用户名和密码   cookie,然后重新认证   每一个请求。

@Scott Mitchell已经提出这个问题,并讨论了由于安全隐患而未采取此行动的原因。

我觉得值得指出为什么这没有意义(甚至无视泄露信息的安全隐患)。您生成表单身份验证票证(cookie)的原因是,您允许ASP.NET使用该票证标记此用户浏览器,以便您确认这是已经过身份验证的指定用户。

通过向他们发出一张票,你这样做意味着他们不需要像以前那样进行身份验证。

一个很好的类比就是你去了一个酒吧,在你的路上你被保镖扫描你的身份以确保你的身份证是合法的并且你已经超过21岁。确认后,他们会给你一个手腕带是一定的颜色/设计。

使用手腕带,您可以离开建筑物吸烟并返回内部避开线路,并且需要扫描您的身份证,以便您返回当天。现在你应该回​​家,但是当你去睡觉时不要取下手腕带(比如让浏览器打开过夜),你第二天就会回到酒吧并尝试展示你的手腕带以绕过这条线。在这一点上,你被拒绝是因为你有最后一个晚上的手腕带,被告知要到线后面并再次获得授权。

答案 2 :(得分:3)

如果将DisplayRememberMe属性设置为false,则cookie将不会保留在客户端计算机上。然后它将被存储在内存中。

如果您使用HTTPS / SSL,它将在前往客户端计算机的路上受到保护。

只剩下理论上的可能性:

  • 中断SSL加密
  • 从客户端计算机的内存中窃取cookie

然后打破cookie上的加密。

可能有一些更简单的方法来攻击您的系统。

http://msdn.microsoft.com/en-us/library/ms998310.aspx