我希望在我的网站上实现忘记密码功能。我喜欢这样的选项,其中包含一段时间后过期的临时一次性使用URL的电子邮件被发送给用户。
我已经查看了以下页面以获得这些想法,但我不知道如何使用ASP.NET和C#实现这一点。正如其中一位用户指出的那样,如果我可以在不将这些信息存储在数据库中的情况下实现这一点,那将是理想的。请指教。
Password reset by emailing temporary passwords
感谢。
答案 0 :(得分:64)
最简单的方法可能是修改你的用户表以添加2个额外的列,或者如果你不想修改现有的表,你可以添加一个名为“UserPasswordReset”的新依赖表或类似的东西。列是这样的:
PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME
如果您使用其他表路径,您还可以添加UserID列,将其作为主键,并将foriegn键引用返回到users表。还建议使用UNIQUE约束。然后,您只需在asp.net应用程序中使用Guid作为令牌。
流程可能是这样的:
我知道你想避免修改数据库,但它确实可能是最简单的方法。
答案 1 :(得分:2)
@Alex
您还可以在.NET中使用System.Security.Cryptography类作为哈希算法。例如:
using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
答案 2 :(得分:1)
这里是你朋友的System.Guid类,因为它会产生一个独特的(好的,足够独特的)128位数字:
答案 3 :(得分:1)
我使用Hashing Class创建由当前日期/时间和用户电子邮件地址组成的独特自动登录:
string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);
从http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/
获取哈希类然后使用以下命令从URL中获取它:
if (Request.QueryString["hash"] != null)
{
//extract Hash from the URL
string strHash = Request.QueryString["hash"];
}
答案 4 :(得分:1)
我肯定会在此过程中包含数据库。请求重置后,最好指出该帐户已被锁定。
例如,如果您因为认为自己的帐户遭到入侵而更改了自己的权限,那么在进行变更流程时,您绝对不希望它仍然可以访问。
此外,包括"真实"如果某人真的想要它并具有马力,则可以解码重置令牌中的信息。生成随机字符串会更安全,将其保存在该用户的行中的db中,然后在单击链接时键回到它。
这给你两件事:
1)没有任何东西可以解密,因此无法从中获得任何价值。 2)用户记录中存在令牌表示正在进行重置,并且该帐户应被视为已锁定。
答案 5 :(得分:0)
向用户电子邮件发送一些数据字符串的目标是验证帐户所有者。请关注一些要点:
结果: 我认为如果你更好
答案 6 :(得分:0)
我会使用哈希码来验证密码重置网址中的详细信息。这一切都可以在不向DB写任何内容或向任何人发送任何特权信息的情况下完成。
简要说明正常密码盐和散列;说盐是1111
而密码是password
,你要连接两个并散列字符串1111password
,比如说这给你一个9999
的哈希值,你' d然后将原始盐1111
和哈希9999
存储在您的用户记录中。
当您验证密码时,您使用存储的salt,连接密码尝试,哈希并与存储的哈希进行比较。例如,asecret
变为1111asecret
,但哈希值为8888
。这与原始哈希不匹配,因此密码匹配失败。
当然,salt和hash通常会使用已建立的加密库正确生成和计算(不要发明自己的!)。
对于密码重置URL,我将输入用户的唯一标识符,即电子邮件地址,请求的日期和新的哈希值。这个哈希值将从连接在一起的那些细节以及已经为用户存储的salt和hash生成。
例如:
Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999
生成连接的新哈希值,即'user@example.com2014-07-1711119999'
,假设这给出了7777
的哈希值。
然后我生成的URL将包含电子邮件,请求日期和新哈希:
https:\\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777
服务器将电子邮件和提供的日期与它的salt和hash结合起来,并确认它生成的哈希与提供的哈希相同。如果这是好的,那么它将显示重置表单,其后面隐藏着相同的三个参数,否则出错。输入新密码时会重新提交并重新检查这些密码,以防止该表单被欺骗。
需要提供电子邮件地址才能发出请求,并且只能通过电子邮件发送到同一地址。日期几乎没有priveleged信息和散列不可逆,所以无论如何什么都没有。没有任何内容写入数据库,任何对参数的篡改都会导致哈希失败,并且URL会报告错误。
答案 7 :(得分:0)
此方法存在问题。一个安全的哈希使令牌真的很长。您可以将盐添加到哈希表本身中(使其长度增加约20个字符),也可以将该唯一的盐存储在数据库中。如果您将盐存储在数据库中,则还可以存储不是从任何现有
派生的随机令牌答案 8 :(得分:-5)
根据您的需要,您可以采用与以下格式类似的格式加密信息
(UserId)-(ExpireDate)
加密数据,制作链接,然后解密数据并从那里采取行动......
原油,但很可能是可用的,不需要使用数据库