FormsAuthentication:它安全吗?

Pet*_*ger 22 asp.net security cookies ssl forms-authentication

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

FormsAuthentication.SetAuthCookie(uniqueUsername, false);
Run Code Online (Sandbox Code Playgroud)

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

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" timeout="30" defaultUrl="Dashboard.aspx" protection="All" />
</authentication>
<authorization>
  <deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Sco*_*ell 43

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

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

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

正如Shiraz所指出的,如果你创建一个持久性cookie,cookie只会持久存储在客户端机器上.(SetAuthCookie指示是否创建此类cookie的参数之一.

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

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

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

有关表单身份验证系统的更多详细信息以及故障单的保护方式,各种<forms>配置设置的工作方式等,请参阅:表单身份验证配置和高级主题.

  • @ Scott-Mitchell实际上在过去,我确实在会话cookie上使用加密来存储SSL连接上的用户名/密码.感谢您的解释,我将继续使用FormsAuthentication.哦,感谢您多年来的4Guys文章,自从我10年前开始使用ASP以来,我已经使用过您的网站... :) (2认同)

Chr*_*sic 8

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

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

@Scott Mitchell已经提出了这个问题,并讨论了由于安全隐患而没有这样做的原因.

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

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

一个很好的类比就是你转到一个酒吧,在你的路上你被保镖扫描你的身份证,以确保你的身份证是合法的,你已经超过21岁.确认这一点后,他们会给你一个手腕带是某种颜色/设计.

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