评估方法签名时,更改密码时需要知道旧密码。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
有没有不需要知道旧密码就可以更改密码的方法?
评估方法签名时,更改密码时需要知道旧密码。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
有没有不需要知道旧密码就可以更改密码的方法?
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
ChangePassword
会抛出异常。但只有在调用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");
RequiresQuestionAndAnswer
属性设置为false时,所有这些解决方案才能起作用。如果RequiresQuestionAndAnswer
设置为true,则ResetPassword方法需要传递安全答案,否则会抛出异常。RequiresQuestionAndAnswer
设置为true,则可以使用此解决方法。上文提到的代码是有效的:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
但是您需要在membership provider标签的web.config中设置requiresQuestionAndAnswer="false"。如果它是true,resetpassword方法会生成一个错误“值不能为空”。 在这种情况下,您必须将问题答案作为参数提供给ResetPassword。
请使用您想要设置的密码替换文本框中的123456。
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
@Rob Church 是正确的:
这里的其他答案是正确的,但可能会使密码处于未知状态。
然而,与其使用他的手动验证解决方案,我建议尝试使用 ResetPassword from token 方法来更改密码,并捕获并显示错误:
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
}
string username = "UserName";
string userpassword = "NewPassword";
string resetpassword;
MembershipUser mu = Membership.GetUser(username, false);
if (mu == null){
Response.Write("<script>alert('Invalid Username!')</script>");
}
else{
resetpassword = mu.ResetPassword(username);
if (resetpassword != null){
if (mu.ChangePassword(resetpassword, userpassword)){
Response.Write("<script>alert('Password changed successfully!')</script>");
}
}
else{
Response.Write("<script>alert('Oh some error occurred!')</script>");
}
}
string username = "UserName";
string userpassword = "NewPassword";
MembershipUser mu = Membership.GetUser(username, false);
mu.ChangePassword(mu.ResetPassword(username), userpassword);
enablePasswordReset
选项。 - Artem Koshelev