首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FormsAuthentication:安全吗?

FormsAuthentication:安全吗?
EN

Stack Overflow用户
提问于 2011-02-08 16:02:25
回答 3查看 11.6K关注 0票数 24

使用FormsAuthentication build it asp.net,创建一个为经过身份验证的用户创建cookie的登录系统非常快速和容易:

代码语言:javascript
复制
FormsAuthentication.SetAuthCookie(uniqueUsername, false);

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

代码语言:javascript
复制
<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()方法调用,用户名将存储在客户端机器上。那么,有人是否有可能破解正在使用的加密,并将被存储的用户名替换为另一个?

我觉得我太偏执了,加密的类型和级别已经足够了,但是我想我会得到一些关于这个话题的专家意见。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-08 17:14:28

所以,我过去所做的就是保存cookie中使用的用户名和密码,然后根据每个请求重新确认这一点。

您应该而不是使用这种方法。密码应该存储在身份验证票据中,而不是,而不是。原因是如果身份验证票证被泄露,那么攻击者就有了用户的密码。可以通过加密身份验证票证cookie来降低此风险,但我假设您是将cookie存储在纯文本中。

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

正如Shiraz所指出的,只有在创建持久cookie的情况下,cookie才会持久化在客户端机器上。( SetAuthCookie的一个参数指示是否要创建这样的cookie。

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

另一件需要理解的事情是,身份验证票已经过期,这使得票证的有效性具有有限的生存期。因此,即使有人窃取用户的cookie,攻击者必须使用该被窃票据的时间也将根据您为窗体身份验证系统指定的timeout值而受到限制(默认情况下为30分钟)。

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

有关表单身份验证系统和如何保护票证的更多细节,以及各种<forms>配置设置如何工作等等,请参见:窗体身份验证配置和高级主题

票数 43
EN

Stack Overflow用户

发布于 2011-02-08 17:50:08

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

所以,我过去所做的就是保存cookie中使用的用户名和密码,然后根据每个请求重新确认这一点。

@Scott已经提出了这个问题,并讨论了不这样做的原因,因为这涉及到安全问题。

我觉得这是值得指出的,为什么这是没有意义的(甚至无视泄露信息的安全影响)。生成表单身份验证票证( cookie)的原因是,您让ASP.NET在此用户浏览器上盖章,使您能够确认这是已经通过身份验证的指定用户。

通过向他们颁发票证,您这样做是为了暗示他们不需要像以前那样进行身份验证。

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

有了你的腕带,你就可以离开大楼吸烟并返回室内,绕过线路,并且需要扫描你的身份证,允许你当天返回。现在你应该回家了,但不要在上床睡觉的时候摘下腕带(就像晚上打开浏览器一样),第二天你就会回到酒吧,试图展示你的腕带来绕过这条线。在这一点上,你被拒绝了,因为你有昨晚的腕带,并被告知到后面的路线,并得到再次授权。

票数 8
EN

Stack Overflow用户

发布于 2011-02-08 16:20:59

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

如果您使用HTTPS/SSL,它将在到达客户端计算机的过程中受到保护。

因此,只剩下理论上的可能性:

  • 破坏SSL加密
  • 从客户端机器的内存中窃取cookie

然后破解曲奇上的加密。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4935321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档