membership 如何找回密码

一、概述

       使用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#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值