【发布时间】:2011-06-28 04:28:23
【问题描述】:
评估方法签名,修改时需要知道旧密码。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
有什么方法可以在不知道旧密码的情况下更改密码。
【问题讨论】:
标签: asp.net asp.net-membership forgot-password change-password
评估方法签名,修改时需要知道旧密码。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
有什么方法可以在不知道旧密码的情况下更改密码。
【问题讨论】:
标签: asp.net asp.net-membership forgot-password change-password
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
【讨论】:
enablePasswordReset 选项必须在 web.config 成员资格提供程序配置中启用
这里的其他答案都是正确的,但会使密码处于未知状态。
ChangePassword 将在密码不符合 Web.Config 中规定的要求(最小长度等)时抛出异常。但它只会在调用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 为真,则需要向ResetPassword 方法传递安全答案,否则会抛出异常。
如果您需要将RequiresQuestionAndAnswer 设置为true,您可以使用此workaround
【讨论】:
上面帖子中提到的这段代码正在运行:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
但是您必须在会员提供者标签的 web.config 中设置 requiresQuestionAndAnswer="false"。如果为真,resetpassword 方法会生成错误“Value can not be null”。 在这种情况下,您必须将问题答案作为参数提供给 ResetPassword。
【讨论】:
使用您想从文本框中设置的密码代替 123456。
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
【讨论】:
@Rob Church 是对的:
这里的其他答案都是正确的,但可以将密码留在 未知状态。
但是,我将尝试使用令牌方法中的 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
}
【讨论】:
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);
【讨论】: