web-dev-qa-db-ja.com

asp.netメンバーシップは、古いパスワードを知らずにパスワードを変更します

メソッドのシグネチャを評価するには、変更する際に古いパスワードを知る必要があります。

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

古いパスワードを知らずにパスワードを変更する方法はありますか?.

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

ここの他の答えは正しいですが、パスワードを不明な状態のままにすることができます。

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
}
23
Rob Church

変更する前にユーザーのパスワードをリセットし、生成されたパスワードをChangePasswordに渡す必要があります。

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

またはインライン:

membershipUser.ChangePassword(membershipUser.ResetPassword(), userWrapper.Password)
14
Geoff Appleford

より簡単なSimpleMembershipProviderを使用してみてください。

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

これらのソリューションはすべて、メンバーシップシステム構成でRequiresQuestionAndAnswerプロパティがfalseに設定されている場合にのみ機能することに注意してください。 RequiresQuestionAndAnswerがtrueの場合、ResetPasswordメソッドにセキュリティの回答を渡す必要があります。そうでない場合、例外がスローされます。

RequiresQuestionAndAnswerをtrueに設定する必要がある場合は、これを使用できます 回避策

4
Kate Moskalenko

123456の代わりに、テキストボックスから設定するパスワードを使用します。

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

上記の投稿で言及されたこのコードは機能しています:

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

ただし、メンバーシッププロバイダータグのweb.configでrequireQuestionAndAnswer = "false"を設定する必要があります。 trueの場合、resetpasswordメソッドは「値をnullにすることはできません」というエラーを生成します。この場合、ResetPasswordのパラメーターとして質問の回答を指定する必要があります。

1
IvoAtanasov

@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
}
0
Potcoava Mihai