评估方法签名时,需要在更改时知道旧密码。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
有没有办法在不知道旧密码的情况下更改密码。
答案 0 :(得分:107)
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
答案 1 :(得分:23)
此处的其他答案是正确的,但可以将密码保留为未知状态。
如果密码不符合Web.Config中规定的要求(最小长度等), 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
}
答案 2 :(得分:14)
您需要在更改前重置用户密码,并将生成的密码传递给ChangePassword
。
string randompassword = membershipUser.ResetPassword();
membershipUser.ChangePassword(randompassword , userWrapper.Password)
或内联:
membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
答案 3 :(得分:4)
尝试使用SimpleMembershipProvider更容易:
var token = WebSecurity.GeneratePasswordResetToken("LoginOfUserToChange");
WebSecurity.ResetPassword(token, "YourNewPassword");
答案 4 :(得分:4)
请注意,所有这些提到的解决方案仅在成员资格系统配置中将RequiresQuestionAndAnswer
属性设置为false时才有效。如果RequiresQuestionAndAnswer
为真,那么需要通过ResetPassword方法传递安全性答案,否则会抛出异常。
如果您需要将RequiresQuestionAndAnswer
设置为true,则可以使用此workaround
答案 5 :(得分:1)
使用您要从文本框设置的密码代替123456.
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
答案 6 :(得分:1)
上述帖子中提到的此代码正在运行:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
但是您必须在成员资格提供程序标记中的web.config中设置requiresQuestionAndAnswer =“false”。如果为true,则resetpassword方法会生成错误“Value not not null”。 在这种情况下,您必须提供问题答案作为ResetPassword的参数。
答案 7 :(得分:0)
@Rob Church是对的:
这里的其他答案是正确的,但可以保留密码 未知状态。
但是,我会尝试使用令牌方法中的ResetPassword更改密码而不是他的解决方案来手动进行验证,并捕获并显示错误:
'9' > '10'
答案 8 :(得分:0)
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>");
}
}
答案 9 :(得分:0)
string username = "UserName";
string userpassword = "NewPassword";
MembershipUser mu = Membership.GetUser(username, false);
mu.ChangePassword(mu.ResetPassword(username), userpassword);