我正在使用ASP.NET MVC来构建Web应用程序。 在登录用户的主屏幕中,我使用User.Current.Name来确定登录的用户身份,这将映射到与当前用户相关的域模型数据的ID。没有其他人能够看到或编辑这些信息(比如他的个人资料)。
我正在使用成员资格和角色来确保只有特定角色的登录用户才能调用此操作(在这种情况下,UserController的主页操作)
部署时,此应用程序将不会有HTTPS。
这种方法被认为是一种安全的方法吗? 恶意用户是否有机会伪造自己的身份以确保User.Current.Name返回不同的名称? 是否需要任何其他配置以确保没有人可以“窃取”其他用户的身份验证cookie?
编辑:使用标准表格身份验证。
答案 0 :(得分:4)
好的,将HTTP嗅探放在一边,因为你不会使用SSL,主要的问题点是身份验证cookie。
默认情况下,表单身份验证/角色Cookie不会加密,只会针对篡改进行签名。您可以使用
加密它<forms protection="All" ... />
这将使用machine.config或web.config中指定的计算机密钥进行加密 - 因此,如果您希望Cookie在应用程序回收期间生效,则需要set a specific machine key。
您还应该查看不持久cookie(即没有“记住我”选项),并确保需要经过身份验证访问的安全页面放在与匿名访问页面分开的子目录/控制器中。
您可能还希望缩短Cookie的生命周期,这可以减少被盗Cookie所用的时间。
<forms
timeout="10"
slidingExpiration="true"... />
您还应该将所有输出编码为网页以停止跨站点脚本,因为这是cookie窃取的主要方式。 ASP.NET cookie是HTTP-Only,这意味着它不应该通过javascript提供,但并非所有浏览器都实现此功能(Safari不支持)。
答案 1 :(得分:-2)
只要您在web.conrfig中设置了machineKey
属性,就会在服务器端对cookie进行加密,并且没有人可以伪造该信息。但是,由于ASP.net MVC中的标准身份验证机制是常规的Forms身份验证,因此您应该启用SSL,以便在登录时没有人可以嗅探用户名和密码。
另一种方法是使用不同的身份验证机制。这可能是Windows身份验证,kerberos,使用客户端证书等。