13

I am building ASP.NET MVC 4 application. I use Simple Membership provider to manage authentication and authorization within the system. What are the ways of changing the password in this approach. I found a ChangePassword method which takes three parameters, including original password, to operate.

Is there any other way to override/change the password for the user without actually knowing original password?

4

2 に答える 2

18

ChangePasswordは、ユーザーがパスワードを変更したい場合に使用されます。現在のパスワードは、これを可能にする証拠です([パスワードの変更]画面を考えてみてください)。

これを行う最も直接的な方法は、WebSecurity.GeneratePasswordResetToken()を呼び出し、その結果を新しいパスワードとともにWebSecurity.ResetPasswordに渡すことだと思います。

  var token = WebSecurity.GeneratePasswordResetToken("UserName");
  var result = WebSecurity.ResetPassword(token, "NewPassword");
于 2013-01-10T16:29:05.010 に答える
4

MVC 4 で SimpleMembership を使用してパスワードのリセット/変更を実装する方法に関する詳細な記事がここにあります。ダウンロード可能なソースコードも含まれています。

この例では、電子メールを使用して URL をユーザーに送信し、クリックしてパスワードをリセットします。これは、ユーザーの別の検証であるため、ユーザーが Web サイトで古いパスワードと新しいパスワードを直接入力するよりも安全です。これにより、誰かがユーザー パスワードを入手し、パスワードを変更してロックアウトするシナリオが緩和されます。これにより、ユーザーはパスワードを忘れた場合にパスワードをリセットすることもできます。

リンク付きのメールを送信するコードは次のようになります。

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPassword(ResetPasswordModel model)
{
    string emailAddress = WebSecurity.GetEmail(model.UserName);
    if (!string.IsNullOrEmpty(emailAddress))
    {
        string confirmationToken =
            WebSecurity.GeneratePasswordResetToken(model.UserName);
        dynamic email = new Email("ChngPasswordEmail");
        email.To = emailAddress;
        email.UserName = model.UserName;
        email.ConfirmationToken = confirmationToken;
        email.Send();

       return RedirectToAction("ResetPwStepTwo");
    }

    return RedirectToAction("InvalidUserName");
}

これにより、渡された ID としてトークンを受け入れる Web API へのリンクを含む電子メールが作成されます。リンクをクリックすると、このメソッドがヒットします。

[AllowAnonymous]
public ActionResult ResetPasswordConfirmation(string Id)
{
    ResetPasswordConfirmModel model = new ResetPasswordConfirmModel() { Token = Id };
    return View(model);
}

このアクションは、クエリ文字列からトークンを取得し、ユーザーが新しいパスワードを入力できるようにするビューに渡される ResetPasswordConfirmationModel にトークンを配置します。新しいパスワードは、正しく入力されていることを確認するために 2 回入力され、ページで検証されます。この情報を送信すると、実際にパスワードをリセットするこのアクションの POST バージョンに移動します。

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPasswordConfirmation(ResetPasswordConfirmModel model)
{
    if (WebSecurity.ResetPassword(model.Token, model.NewPassword))
    {
        return RedirectToAction("PasswordResetSuccess");
    }
    return RedirectToAction("PasswordResetFailure");
}
于 2013-12-12T15:32:20.767 に答える