C# 如何在ASP.NET MVC应用程序中实现密码检查延迟?

C# 如何在ASP.NET MVC应用程序中实现密码检查延迟?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我希望所有登录我的web应用程序的尝试都不少于1秒,以降低暴力攻击的可行性。如果我只是在代码中添加类似的内容: Thread.Sleep(1000) 我希望我很容易受到一种非常简单的ddos攻击:只需向站点发送几十个登录请求,就会发生线程池不足的情况。(我不相信那个线程。睡眠会将线程返回到线程池,是吗?) 实现此功能的正确方法是什么?如果您想降低暴力攻击的可行性,为什么不在(比如)对同一帐户进行3次错误登录尝试后,在没有正确登录的情况下实施锁定(强制密码重置) 如果您需要DDOS保护,我会单独

我希望所有登录我的web应用程序的尝试都不少于1秒,以降低暴力攻击的可行性。如果我只是在代码中添加类似的内容:

Thread.Sleep(1000)
我希望我很容易受到一种非常简单的ddos攻击:只需向站点发送几十个登录请求,就会发生线程池不足的情况。(我不相信那个线程。睡眠会将线程返回到线程池,是吗?)


实现此功能的正确方法是什么?

如果您想降低暴力攻击的可行性,为什么不在(比如)对同一帐户进行3次错误登录尝试后,在没有正确登录的情况下实施锁定(强制密码重置)

如果您需要DDOS保护,我会单独处理—很可能在流量到达您的web服务器之前进行处理。这真的取决于你是否成功

我不知道目前ASP.NET中是否有一种简单的异步延迟响应的方法。我希望C#5和.NET 5中的异步功能可以让您返回一个
任务
,在这一点上,您可以编写如下内容:

await Task.Delay(1000);

你可以做的,而不是睡眠线程(你担心饥饿是正确的),是有一个滑动窗口的基础上失败的登录尝试为给定的用户名。如果滑动窗口尚未运行,您可以将其存储在内存缓存中,并忽略该用户名的登录尝试

这里有一篇关于这一可能实现的博文:


嗨,Jon,感谢您抽出时间回复。我并不特别担心DDOS,只是我不想让它比“默认”更简单。我同意,一般而言,DDOS必须单独处理。锁定通常会增加支持电话的数量,因此最好避免。当然,我可以像ActiveDirectory那样进行临时锁定,但实现起来有点困难。确保请求不少于一秒钟看起来更简单。这真的是一个坏主意吗?@zespri:如果你没有任何锁定,那么蛮力仍然可以通过涓涓细流的方式实现(如果你没有太多DDOS保护,也不必太涓涓细流)。我真的会考虑锁定——即使你把它推到(比如说)10个坏登录,并使它在登录页面上非常清晰。如果有人连续10次未能成功登录,他们在11日成功登录的几率有多大?你可以让它暂时化——老实说,这可能不会让它变得那么困难。可能比让异步延迟工作更容易。是的,谢谢,我希望用更简单的方法来避免锁定解决方案的复杂性。很可能我在这里运气不好,必须要上锁;滑动窗口最短可为1秒。这将达到您在原始帖子中提到的预期结果。我的意思是,我想这取决于你对锁定的定义,但这实际上也是你在线程睡眠中要做的。你会无条件地在代码中加入睡眠函数,还是只有在登录失败时才这样做?如果是后者,则可能无法有效抵御暴力攻击——如果服务器响应时间超过几百毫秒,则表示登录不正确;攻击者不必等待您的响应。无条件延迟可以防止这种情况发生,但合法用户会注意到这一点,并且很容易导致线程不足。建议的其他应对措施将有效地防止暴力攻击,而不存在这些问题。