29

Microsoft は、ASP.NET Identity (ASP.NET MVC 5 のデフォルトでもあります) と呼ばれる新しいメンバーシップ システムを考え出しています。サンプル プロジェクトを見つけましたが、これにはパスワード リセットが実装されていません。

パスワード リセットのトピックで、次の記事が見つかりました: 1 つの ASP.NET ID を使用したユーザー確認とパスワード リセットの実装 - 苦痛または喜び、組み込みのパスワード回復を使用しないため、私にとっては役に立ちません。

オプションを見ていると、ユーザーに送信するリセット トークンを生成する必要があると思います。ユーザーはトークンを使用して新しいパスワードを設定し、古いパスワードを上書きできます。

IdentityManager.Passwords.GenerateResetPasswordToken/を見つけましたが、それがパラメーターIdentityManager.Passwords.GenerateResetPasswordTokenAsync(string tokenId, string userName, validUntilUtc)を何を意味するのかわかりませんでした。tokenId

ASP.NET で MVC 5.0 を使用してパスワード リセットを実装するにはどうすればよいですか?

4

2 に答える 2

9

わかりました。tokenid は自由に選択された ID であり、パスワード オプションを識別します。例えば、

1.パスワード回復プロセス、ステップ1のように見えます( https://stackoverflow.com/a/698879/208922 に基づいています)

[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
//[RecaptchaControlMvc.CaptchaValidator]
public virtual async Task<ActionResult> ResetPassword(
                                              ResetPasswordViewModel rpvm)
{
    string message = null;
    //the token is valid for one day
    var until = DateTime.Now.AddDays(1);
    //We find the user, as the token can not generate the e-mail address, 
    //but the name should be.
    var db = new Context();
    var user = db.Users.SingleOrDefault(x=>x.Email == rpvm.Email);

    var token = new StringBuilder();

    //Prepare a 10-character random text
    using (RNGCryptoServiceProvider 
                        rngCsp = new RNGCryptoServiceProvider())
    {
        var data = new byte[4];
        for (int i = 0; i < 10; i++)
        {
            //filled with an array of random numbers
            rngCsp.GetBytes(data);
            //this is converted into a character from A to Z
            var randomchar = Convert.ToChar(
                                      //produce a random number 
                                      //between 0 and 25
                                      BitConverter.ToUInt32(data, 0) % 26 
                                      //Convert.ToInt32('A')==65
                                      + 65
                             );
            token.Append(randomchar);
        }
    }
    //This will be the password change identifier 
    //that the user will be sent out
    var tokenid = token.ToString();

    if (null!=user)
    {
        //Generating a token
        var result = await IdentityManager
                                .Passwords
                                .GenerateResetPasswordTokenAsync(
                                              tokenid, 
                                              user.UserName, 
                                              until
                           );

        if (result.Success)
        {
            //send the email
            ...
        }
    }
    message = 
        "We have sent a password reset request if the email is verified.";
    return RedirectToAction(
                   MVC.Account.ResetPasswordWithToken(
                               token: string.Empty, 
                               message: message
                   )
           );
}

2 次に、ユーザーがトークンと新しいパスワードを入力すると、次のようになります。

[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
//[RecaptchaControlMvc.CaptchaValidator]
public virtual async Task<ActionResult> ResetPasswordWithToken(
                                            ResetPasswordWithTokenViewModel 
                                                        rpwtvm
                                        )
{
    if (ModelState.IsValid)
    {
        string message = null;
        //reset the password
        var result = await IdentityManager.Passwords.ResetPasswordAsync(
                                                   rpwtvm.Token, 
                                                   rpwtvm.Password
                           );
        if (result.Success)
        { 
            message = "the password has been reset.";
            return RedirectToAction(
                        MVC.Account.ResetPasswordCompleted(message: message)
                   );
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(MVC.Account.ResetPasswordWithToken(rpwtvm));
}

github のサンプル プロジェクトへのスケルトンの提案。必要な人がいる場合はテストすることができます。メール送信はまだ作成されていません。

于 2013-09-26T19:05:38.277 に答える
5

多くの問題のように思えます...上記はどのような利点をもたらしますか:

  1. ユーザーが「Recover Account」リンクをクリックする
  2. これは、日時ティック値の 64 バイトでエンコードされた文字列 (疑似ハッシュと呼びます) を電子メールで送信します。
  3. 電子メール内のリンクをクリックしてコントローラー/アクション ルートに戻ります。
  4. 電子メールとその送信元サーバーを疑似ハッシュと照合し、疑似ハッシュを復号化し、送信されてからの時間を検証し、
  5. ユーザーが新しいパスワードを設定するためのビューを提供します
  6. 有効なパスワードを使用すると、コードによって古いユーザー パスワードが削除され、新しいパスワードが割り当てられます。
  7. 完了したら、成功したかどうかに関係なく、疑似ハッシュを削除します。

このフローでは、ドメインからパスワードを送信することは決してありません。

誰か、これがいかに安全でないかを私に証明してください。

于 2014-03-19T13:46:21.397 に答える