メソッドのシグネチャを評価するには、変更する際に古いパスワードを知る必要があります。
membershipUser.ChangePassword(userWrapper.OldPassword, userWrapper.Password)
古いパスワードを知らずにパスワードを変更する方法はありますか?.
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
ここの他の答えは正しいですが、パスワードを不明な状態のままにすることができます。
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
がtrueの場合、ResetPasswordメソッドにセキュリティの回答を渡す必要があります。そうでない場合、例外がスローされます。
RequiresQuestionAndAnswer
をtrueに設定する必要がある場合は、これを使用できます 回避策
123456の代わりに、テキストボックスから設定するパスワードを使用します。
MembershipUser user;
user = Membership.GetUser(userName,false);
user.ChangePassword(user.ResetPassword(),"123456");
上記の投稿で言及されたこのコードは機能しています:
string username = "username";
string password = "newpassword";
MembershipUser mu = Membership.GetUser(username);
mu.ChangePassword(mu.ResetPassword(), password);
ただし、メンバーシッププロバイダータグのweb.configでrequireQuestionAndAnswer = "false"を設定する必要があります。 trueの場合、resetpasswordメソッドは「値をnullにすることはできません」というエラーを生成します。この場合、ResetPasswordのパラメーターとして質問の回答を指定する必要があります。
@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
}