【问题标题】:How secure is this ASP.Net authentication model?这种 ASP.Net 身份验证模型的安全性如何?
【发布时间】:2010-10-04 07:47:53
【问题描述】:

我已经使用 c# 和 asp.net 创建了一个 Web 身份验证应用程序,并且想证明您认为它的安全性。所有导航都是通过https完成的。

用户注册

  1. 用户输入 3 个数据点(SSN、Lname 和 DOB)。如果在我们的系统中找到该组合,则会设置会话变量并导航到下一页。
  2. 如果设置了#1 的会话变量,继续并询问用户名、密码、安全问答等。使用 Linq 保存数据并在实际保存事件之前验证会话变量。 PWD 和安全答案使用 salt 和 sha 进行哈希处理。 (使用验证控件和文本框限制来限制输入)

重设密码

  1. 与注册中的#1 相同,但包括用户名。如果没问题,设置第 1 步会话变量。
  2. 如果设置了第 1 步会话变量,则最多询问 3 次安全问题。加盐/散列并验证数据库加盐/散列。如果匹配,则设置第 2 步会话变量。(使用验证控件和文本框限制来限制输入)
  3. 检查步骤 2 会话变量。求新密码。使用 LINQ 哈希/加盐并保存。

登录(使用验证控件和文本框限制来限制输入)

  1. 收集用户名和密码。与用户名匹配的哈希/盐密码,并查看密码是否与哈希匹配。如果没问题,实例化用户对象并传递到默认页面。
  2. 所有页面都继承自母版页。 Masterpage 具有验证用户对象是否设置为有效实例的代码。如果不是有效的用户对象,则会调用注销,重定向到主登录页面。

有点罗嗦,但想清楚。

我在这里遗漏了什么吗?我想使用 MS 的表单身份验证,但决定推出自己的身份验证,因为我在使用 FBA 完成一些我想要完成的自定义内容时遇到了一些问题。通过使用会话变量作为步骤完成标记,这是否足以防止会话窃取或书签?有没有更好的方法来做到这一点?

有什么想法吗?

【问题讨论】:

  • 请告诉我您的数据库中没有以明文形式存储 SSN。

标签: c# asp.net security


【解决方案1】:

ASP.NET 表单身份验证或使用成员资格提供程序位的哪些方面不符合您的需求?我发现两者在许多不同的场景中都非常灵活?

自己动手通常会让未来的生活变得艰难,尤其是当您需要开始做出改变时。此外,您现在使用母版页来验证用户登录状态等可能没问题,但是当您需要更多母版页时,您就开始需要在每个母版页中复制相同的代码块并保持一致。这可能会成为未来某个地方的维护噩梦。

如果您没有在框架中使用现成的身份验证工具,您应该在其他地方使用这种东西,例如在 HttpModule 中。

我认为你应该重新审视你正在做的事情。如果您需要将用户特定的数据/对象挂在用户对象之外,请查看实现您自己的自定义 IIdentity 对象。然后分配给自定义IPrincipal,您可以在 ASP.NET 中附加到Context.User

@asp316 和@Jack(评论)我会建议抓住这两本书:

Developing More-Secure Microsoft® ASP.NET 2.0 ApplicationsDominick Baier

Professional ASP.NET 2.0 Security, Membership, and Role Management by Stefan Schackow

您会惊讶于 .NET 中内置的安全基础架构的真正灵活性。除了将 <authentication mode="Forms"> 设置添加到您的 web.config 并在页面上添加 <asp:login runat="server"/> 控件之外,它还有很多其他功能。

【讨论】:

  • 我不同意;随着我越来越多地使用预卷的 .NET 解决方案,我发现它们越来越不受欢迎。我发现它们比定制解决方案灵活得多。此外,对于母版页,他总是可以实现某种接口,其中包括用于检查登录的安全代码。
  • @Jack - 请参阅 Joel 的回答以获得进一步的理由。除非您知道自己在做什么,否则请使用经过尝试和测试的可用基础架构。
  • 我正在尝试完成几件事。我希望安全问题是一个下拉列表并从数据库中填充,并且需要它在密码恢复中起作用。我还需要保存其他信息并需要对其进行加密。我了解其中一些,但找不到资源来说明如何。
【解决方案2】:

“自己动手”的问题在于,它很容易以微妙的方式出错,以至于它看起来起作用。然后,您当然会部署此代码并继续处理其他事情,而不知道有任何问题。毕竟,它通过了你所有的测试。

一年后,事实证明您的网站在六个月前被黑客入侵,而您直到那时才知道。

最好找到一种方法来依赖安全专家编写的实现。

【讨论】:

  • 感谢您的信息。是时候多买些书了!!
【解决方案3】:

我认为你已经准备好了;我还会在一定数量的错误登录尝试后将用户锁定一段时间(5 次错误尝试后 1 小时?)并检查请求之间的时间(根据我的经验,AjaxControlToolkit“nobot”在这里可以创造奇迹)。

一个选项,而不是使用您的母版页作为安全代码,是实现一个页面(或母版页)可以继承的接口;这样,如果您确实扩展到多个母版页,或者如果您有母版页之外的页面,您可以继续使用相同的安全检查代码。

根据您的要求,我会回避(必需的)安全问题;我总是忘记我的。您已经在检查 SSN、生日、姓氏、用户名和密码;任何知道这一切的人都可能猜出你母亲的娘家姓。

[编辑]

另外,我确实认为自己推出是可以的,只要你疯狂地审查它。扔一些其他人,看看它是如何支撑的。我完全理解 ASP.NET 控件选项的不灵活;他们的控件可能会更安全(虽然,你永远不应该盲目相信任何东西,尤其是你不知道魔法黑盒子背后发生了什么的东西),但有时你只需要滚动你的当它不够灵活时拥有它。

【讨论】:

  • Jack - ASP.NET 身份验证不仅仅是 UI 控件。如果您对底层管道/管道足够了解,那么您无需自己动手。相信我,在银行和电子商务等环境中使用 .NET 的 8 年已经教会了我这一点。
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 2012-06-20
  • 2011-05-25
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多