| 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字段值 |