如何在Membership中实现修改密码的功能

 
2008-02-14 16:10

Membership中要修改密码,真是很麻烦,还要提供原密码或者密码保护的问题,不知道老外是如何想的,也许是微软太注重安全了吧,不过这就对我们造成了麻烦,客户的密码忘了,让我们在后台给修改下,我们还要知道客户的原密码或者密码保护的问题才能修改,这个现实生活中不太好办。
没办法,自己手动解决啦:
办法1:用Membership里的ResetPassword ()方法。
      思想:
        这个函数可以将用户密码重置为一个自动生成的新密码,我们可以通过这个方法来获取用户的新密码,然后接合ChangePassword()方法就可以修改用户的密码了。
        实现:
       修改密码:
MembershipUser mymem = Membership.GetUser(uname);//uname为要修改用户的帐号
string p = mymem.ResetPassword();//将用户密码重置为一个自动生成的新密码
mymem.ChangePassword(p, "www.cn-web.com");//修改用户密码为http://www.cn-web.com/

注意:
因为我们用了ResetPassword()方法,这个方法重载两次,如果用的是没有参数的重载,就需要修改web.config文件内关于对membership的配置。
将enablePasswordReset属于置为true,requiresQuestionAndAnswer属性置为false,如果置为true,则ResetPassword()需要用另一种重载方式,即需要输入用户的密码答案才行,(系统管理员不可能去破解用户的密码答案去吧,这个可是加密的),所以requiresQuestionAndAnswer属性必需置为false,这就意味着系统中不能用通过密码提示问题和答案来找回密码的功能了
晕之,上述此种方法有限制,只适合于系统中不用“通过用户的密码提示问题和答案找回密码”的功能的情况下才适合,下面再说一个通用点的办法来解决Membership如何修改密码的问题。

办法2:用自定义的密码去替换用户的密码然后再用ChangePassword修改。
思想:
ChangePassword函数需要提供旧密码才能修改,如果我们知道用户的旧密码就可以了,办法1中可以将用户的密码重置,然后得到用户密码,这样就可以修改了,但是重置用户的密码有使用限制。怎么样我们才能得到用户的旧密码呢(不可能去暴力破解),我们可以这样,在用户修改密码之前,将用户的密码修改为一个已知的密码,然后通过这个已知的密码再用ChangePassword函数去修改。
可能听起来有点晕,看实现:
实现:
       修改密码:
MembershipUser mymem = Membership.GetUser(uname);//uname为要修改用户的帐号
UpdatePwd(uname);;//将用户密码重置为一个我们已经的一个密码,我这里为laohan
mymem.ChangePassword("laohan", "www.cn-web.com");//用户旧密码为laohan,这时就可以修改用户密码为http://www.cn-web.com/

UpdatePwd方法的实现
   /// <summary>
       /// 更新密码
       /// </summary>
       public void UpdatePwd(string uname)
       {
           int rowsAffected;
           SqlParameter[] parameters = {
     new SqlParameter("@ApplicationName", SqlDbType.NVarChar,256),
     new SqlParameter("@UserName", SqlDbType.NVarChar,256),
     new SqlParameter("@NewPassword", SqlDbType.NVarChar,128),
     new SqlParameter("@PasswordSalt", SqlDbType.NVarChar,128),
     new SqlParameter("@CurrentTimeUtc", SqlDbType.DateTime),
     new SqlParameter("@PasswordFormat", SqlDbType.Int)};
           parameters[0].Value = "cn_web.com";//您的应用程序名字,如何查看这个名字请参考下附1
           parameters[1].Value = uname;//要修改用户的帐号
           parameters[2].Value = "081i356xYjAmZI+mqvCoKOix9g4=";//这里是laohan的加密码密码,参考附2
           parameters[3].Value = "3I6t4j5h/vxnhNgYIe7oiw==";//每个密码对应的PasswordSalt对不同,可以查参考附2           parameters[4].Value = DateTime.Now;
           parameters[5].Value = 1;
DbHelperSQL.RunProcedure("aspnet_Membership_SetPassword", parameters, out rowsAffected);//注意,RunProcedure是我自己定义的执行存储过程的方法,您在这里要替换为您自己的方法,aspnet_Membership_SetPassword是启用Membership后自动在数据库中生成的修改密码的存储过程.
       }

附1获取当前系统的应用程序名字:
打开sqlserver中表aspnet_Applications,如图就可以看到您当前系统的ApplicationName了,可以自定义:

附2获取公共密码的字串:
我这里公共密码为laohan,我就先注册一个帐户,密码为laohan,然后打开sqlserver中表aspnet_Users查看该帐户的userid

 

得到用户的userid后,再打开sqlserver中表aspnet_Membership,查看对应该密码的Password字段值和PasswordSalt字段值

2.Forget Password

       MembershipUser user = Membership.GetUser(userName);
        bool value = false;
        try
        {
            value = user.ChangePassword(user.ResetPassword(Server.HtmlEncode(this.txtAnswer.Text)), this.txtNewPwd.Text);
        }
        catch(Exception ex)
        {
            this.lblErrorInfo.Text = ex.Message ;

        }   这里注意web.config中的,requiresQuestionAndAnswer属性置为true,否则答案正确错误就没有关系都可以改的。

  将enablePasswordReset属于置为true,requiresQuestionAndAnswer属性置为false,如果置为true,则ResetPassword()需要用另一种重载方式,即需要输入用户的密码答案才行,(系统管理员不可能去破解用户的密码答案去吧,这个可是加密的),所以requiresQuestionAndAnswer属性必需置为false,这就意味着系统中不能用通过密码提示问题和答案来找回密码的功能了

你可能感兴趣的:(修改密码)