sig*_*urd 7 security asp.net-mvc captcha asp.net-identity-2
我有一个ASP.NET MVC 5应用程序,它使用ASP.NET Identity 2.0进行用户身份验证.
目前,用户在每次登录尝试时都被迫输入验证码,但它会引起许多关于验证复杂性的抱怨.
主要目标是使人尽可能简单地登录,并使尽可能复杂的机器人.
我决定在一定数量的失败登录尝试后显示验证码.关于它有很多 已经 被问到的 问题,但我没有找到能够帮助我构建相当完整的解决方案的答案.我发现这个问题,关于跟踪失败的尝试,但它也使用了锁定,这是不是我想要的.根据这个答案,旧的ASP.NET成员资格提供程序中提供了所需功能的一部分,并且在ASP.NET身份中不可用(但是?).
所以,我最终得到了以下简化算法:
问题是:如何将传入请求区分为特定登录请求?
我不能依赖cookie,会话,IP等,因为任何机器人都可以改变它们.我也不能依赖登录,因为登录可能不完全存在.显而易见的方法是创建一个单独的表来存储登录,失败的尝试次数和时间戳,但机器人可以使用假登录轻松地将其充满,尽管我可以通过删除schedlued作业中的旧条目来解决此问题.
是有效的解决方案吗?有没有更好的方法呢?
身份框架有每个用户登录失败的计数。您可以通过增加它await UserManager.AccessFailedAsync(userId)。属性ApplicationUser.AccessFailedCount存储用户记录的失败计数。并重置失败的计数调用await UserManager.ResetAccessFailedCountAsync(userId)
因此可以利用这一点。
但是,这不计入无效用户名 - 数据库中不存在用户的登录尝试。对于这种情况,您可以使用建议的表并通过 cron 任务定期清除记录。
但是,如果用户尝试登录并每次尝试都输入不同的用户名,则此方法将会失败。所以无论如何我都会在那里放一块 cookie,但不要过分依赖它,因为我知道它很容易被杀死。
另一个解决方案是在每个页面上使用新的 Google验证码。然而,这是一项新技术,有报道称它并不完全可靠。