asp.net会员更改密码而不知道旧密码

评估方法签名,在更改旧密码时需要知道。

membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password) 

有没有办法改变密码而不知道旧的。

  string username = "username"; string password = "newpassword"; MembershipUser mu = Membership.GetUser(username); mu.ChangePassword(mu.ResetPassword(), password); 

这里的其他答案是正确的,但可以使密码处于未知状态。

如果密码不符合Web.Config中规定的要求(最小长度等), ChangePassword将会抛出exception。 但是,只有在调用ResetPassword后才会失败,因此原始用户或尝试更改密码的用户不会知道密码。 在更改密码之前检查复杂性要求以避免这种情况:

 var user = Membership.GetUser(userName, false); if ((newPassword.Length >= Membership.MinRequiredPasswordLength) && (newPassword.ToCharArray().Count(c => !Char.IsLetterOrDigit(c)) >= Membership.MinRequiredNonAlphanumericCharacters) && ((Membership.PasswordStrengthRegularExpression.Length == 0) || Regex.IsMatch(newPassword, Membership.PasswordStrengthRegularExpression))) { user.ChangePassword(user.ResetPassword(), newPassword); } else { // Tell user new password isn't strong enough } 

在更改密码之前,您需要重置用户的密码,并将生成的密码传递给ChangePassword

 string randompassword = membershipUser.ResetPassword(); membershipUser.ChangePassword(randompassword , userWrapper.Password) 

或内联:

 membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password) 

尝试使用SimpleMembershipProvider更容易:

 var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange"); WebSecurity.ResetPassword(token, "YourNewPassword"); 

请注意,所有这些提到的解决scheme将仅在RequiresQuestionAndAnswer属性在成员资格系统configuration中设置为false时才起作用。 如果RequiresQuestionAndAnswer为true,则ResetPassword方法需要传递安全性答案,否则会引发exception。

如果您需要将RequiresQuestionAndAnswer设置为true,则可以使用此解决方法

使用您想从文本框中设置的密码代替123456。

  MembershipUser user; user = Membership.GetUser(userName,false); user.ChangePassword(user.ResetPassword(),"123456"); 

上面的post中提到的代码正在工作:

 string username = "username"; string password = "newpassword"; MembershipUser mu = Membership.GetUser(username); mu.ChangePassword(mu.ResetPassword(), password); 

但是您必须在成员资格提供者标记的web.config中设置requiresQuestionAndAnswer =“false”。 如果是,则resetpassword方法将生成一个错误“值不能为空”。 在这种情况下,您必须将问题答案作为参数提供给ResetPassword。

@Rob教会是对的:

这里的其他答案是正确的,但可以使密码处于未知状态。

但是,而不是他的解决scheme来手动进行validation,我会尝试更改密码使用令牌ResetPassword方法并捕获并显示错误:

 var user = UserManager.FindByName(User.Identity.Name); string token = UserManager.GeneratePasswordResetToken(user.Id); var result = UserManager.ResetPassword(user.Id, token, model.Password); if (!result.Succeeded){ // show error }