一、概述
使用membership机制的asp.net网站,关于密码的问题有点绕,在此做个记录,免得以后重复做这方面的工作。
1、如果记得旧密码,想换密码,则使用changePassword控件即可。
2、 如果用户忘记了密码,记得密码问题答案,可以通过密码问题答案,重置自己的密码为一个随机的密码(通过邮件发送),然后自己再修改。
实现也比较简单,vs自带了一个passwordRecovery控件,然后再设置一个发送密码的邮件服务器即可。
<system.net>
<mailSettings>
<smtp from="xxxx@163.com">
<network host="smtp.163.com" password="xxxxx" userName="xxxxx" />
</smtp>
</mailSettings>
</system.net>
3、如果用户忘记了密码,而且又忘记了密码问题答案,如何找回密码?
答案是无法找回,只能重置,而且membership没有直接的方法重置,只能通过自带的存储过程强行重置密码,因为:
//1.密码是哈希加密的,无法通过MembershipUser.GetPassword()获取。(如果通过web.config配置密码为明码,则可以,但是这样不安全,毫无意义。)
//2.修改密码必须提供问题答案,通过MembershipUser.ResetPassword(passwordAnswer)重置密码。(也可以通过web.config配置 RequiresQuestionAndAnswer为false, 这样可以直接不需要问题答案重置密码。但这样如果用户记得密码问题答案,也无法自行找回密码,只能重置密码,且重置后的密码还要想办法告诉给用户。)
//3.在第2点的基础上,如果忘记密码,又忘记密码问题答案,那么无法通过MembershipUser.ResetPassword(passwordAnswer)重置密码,只能绕过membership的各种方法,直接调用ORA_ASPNET_MEM_SETPASSWORD存储过程操作数据重置密码,由于密码是哈希加密的, 只需要自己提供密码加密程序即可。
关于哈希加密的代码可以参考下面:
/// <summary>
/// 密码加密钥
/// </summary>
/// <returns></returns>
public string GenerateSalt()
{
byte[] data = new byte[0x10];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
return Convert.ToBase64String(data);
}
/// <summary>
/// 哈希密码加密(不可还原)
/// </summary>
/// <param name="s">原始字串</param>
/// <param name="saltKey">Salt加密字串</param>
/// <param name="hashName">加密格式(MD5, SHA1, SHA256, SHA384, SHA512....)</param>
/// <returns>加密過的密碼</returns>
public string EncryptToHashString(string s, string saltKey, string hashName)
{
byte[] src = System.Text.Encoding.Unicode.GetBytes(s);
byte[] saltbuf = Convert.FromBase64String(saltKey);
byte[] dst = new byte[saltbuf.Length + src.Length];
byte[] inArray = null;
System.Buffer.BlockCopy(saltbuf, 0, dst, 0, saltbuf.Length);
System.Buffer.BlockCopy(src, 0, dst, saltbuf.Length, src.Length);
System.Security.Cryptography.HashAlgorithm algorithm = System.Security.Cryptography.HashAlgorithm.Create(hashName);
inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
参考文献:
1.http://www.dotblogs.com.tw/02047788a/archive/2009/01/27/6951.aspx?fid=15773
2.http://www.cnblogs.com/lybohe0807/archive/2010/10/16/1853153.html
3.http://bbs.csdn.net/topics/330145566
4.http://blog.163.com/ghost____/blog/static/3231953720102293465491/
5.http://zhyj0303.blog.163.com/blog/static/135278602201021113946148/
6.http://blog.sina.com.cn/s/blog_5f9d697b0100ulk1.html
7.https://msdn.microsoft.com/zh-cn/library/system.web.security.membershipuser.changepassword(v=vs.110).aspx
8.https://msdn.microsoft.com/zh-cn/library/2x0c6sfa(v=vs.110).aspx
9.https://msdn.microsoft.com/zh-cn/library/d94bdzz2(v=vs.110).aspx
10.https://msdn.microsoft.com/zh-cn/library/system.web.security.membershipuser_methods(v=vs.110).aspx
11.https://msdn.microsoft.com/zh-cn/dazakw52.aspx#