2012-10-24 35 views
1

我正在为C#.net网站的登录页面工作,并且遇到了问题,并希望你们能够帮助我。C#中的一次性密码在一段时间后过期?

这种情况: 用户到达登录屏幕,然后从那里他们键入他们的电子邮件,我们将引用数据库来检查有效性,如果它是有效的,随机8位密钥将被生成并发送到电子邮件。用户现在应该检查他/她的电子邮件以获得“一次性密码”,然后键入一个文本框继续。

生成和电子邮件发送已经完成,但我不知道如何继续这样做

有我的团队成员之间的一些讨论,其中一人建议用会话超时,然后当按钮被点击,电子邮件将被发送,一个会话变量将被创建并且存储一次性密码,然后我们将引用用户使用会话变量输入的文本框文本,如果它是正确的,他们会

我想到的另一种方法是使用Javascript计时器,然后使用网页上的不可见标签进行参考。但我不确定Javascript是否可以允许这种情况发生。

您对这种情况的最佳方法是什么?

谢谢!

+0

呃,需要在这里添加评论,我正在寻找一种方法来做到这一点,而不与数据库交互,因为它更复杂..我想知道是否有办法做到这一点,而不需要存储到数据库中>< –

回答

7

它是时间敏感的,只需将代码存储在数据库中并过期日期时间。然后,当用户拿回他们的令牌时,你可以看到它是否还没有过期,如果有,则要求他们启动过程。

+0

原则上也可以以加密形式在令牌中放置到期时间。但是这很容易出错。 – CodesInChaos

+0

@CodesInChaos,这样做在实践中可能会很好,但如果攻击者知道这些过期时间是如何加密的,他/她可能会创建自己的具有自定义到期时间的令牌。相反,假设数据库受到SQL注入的保护,这种攻击得到缓解。 – SpencerD

+0

@SpencerDoak就我个人而言,我喜欢将标记的散列存储在数据库中(因此读取数据库不足以学习标记)以及过期日期。但是,在伪造的令牌上生成有效的MAC需要泄漏存储在服务器上的密钥,这不应该发生,就像攻击者不应该能够访问数据库一样。 – CodesInChaos