3

GETコントローラーとビューの間でpasswordTokenを保持する際に問題が発生します。トークンが渡され、GETコントローラー内でモデルに正しく追加されていることがわかりますが、ビューでHTML.BeginFormが開始されるとすぐに、モデルに新しいインスタンスがあり、passwordTokenを持つ以前のモデルが失われます。WebSecurity.ResetPasswordを使用するには、passwordTokenを保持する必要があります。これをどのように行うことができるかについての提案はありますか?

私のGETコントローラー:

    [AllowAnonymous]
    public ActionResult PasswordReset(string passwordToken)
    {
        // Token Validation
        var usrID = WebSecurity.GetUserIdFromPasswordResetToken(passwordToken);
        var usr = _dbManager.GetUserInformation(usrID);

        if (usr == null)
        {
            //The link you are using is not valid anymore
            return RedirectToAction("Error", "Account");
        }
        else
        {
            var model = new PasswordReset();
            model.PasswordResetToken = passwordToken;
            return View(model);
        }
    }

私の見解:

@model Project.Models.PasswordReset
@{
ViewBag.Title = "Password Reset";
}

<h2>Password Reset</h2>

<div class="form passwordreset-form">


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <div class="input-form">

        <div class="inputbox-label">
            @Html.LabelFor(m => m.Password)
        </div>
        <div class="inputbox">
            @Html.PasswordFor(m => m.Password)
        </div>

        <div class="inputbox-label">
            @Html.LabelFor(m => m.ConfirmPassword)
        </div>
        <div class="inputbox">
            @Html.PasswordFor(m => m.ConfirmPassword)
        </div>

    </div>
    <div style="float:right;">
        <input type="submit" value="Change Password" />
    </div>

}

</div>

私のPOSTコントローラー:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult PasswordReset(PasswordReset model)
    {
        //Attemp to change password
        var passwordChangeConfirmation = WebSecurity.ResetPassword(model.PasswordResetToken, model.Password); 

            //Password has been changed
        if(passwordChangeConfirmation == true)
        {
            return RedirectToAction("Index", "Home");
        }
            //Password change has failed
        else
        {
            return RedirectToAction("Error", "Account");
        }
    }
4

3 に答える 3

3

POSTクラスを調整して機能させることにしました。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult PasswordReset(PasswordReset model, string passwordToken)
    {
        //Attemp to change password
        model.PasswordResetToken = passwordToken;
        var passwordChangeConfirmation = WebSecurity.ResetPassword(model.PasswordResetToken, model.Password);

        //Password has been changed
        if (passwordChangeConfirmation == true)
        {
            return RedirectToAction("Index", "Home");
        }
        //Password change has failed
        else
        {
            return RedirectToAction("Error", "Account");
        }
    }
于 2013-01-11T21:30:56.347 に答える
2

フォームに追加します。

@Html.HiddenFor(m => m.PasswordResetToken);
于 2013-01-11T20:49:57.723 に答える
1

渡すフィールド(モデルから)のフォームで非表示の入力を使用できます。

@Html.HiddenFor(m => m.PasswordResetToken);

出力で

<input type="hidden" name="PasswordResetToken"></input>
于 2013-01-11T21:44:45.137 に答える