5

MVC4 アプリケーションを ASP.NET メンバーシップから新しい SimpleMembership に移行しようとしていますが、パスワードのリセットで問題が発生しました。私のログイン ビューには、パスワードのリセット ハイパーリンクを含む電子メールを送信するアクションへの AJAX 投稿を行う "パスワードを忘れた" ハイパーリンクがあります (大まかにMSDN ガイドラインに基づいています)。

[HttpPost]
[AllowAnonymous]
public ActionResult ForgotPassword(string userName)
{
    //get the user from database, validate it exists, etc.
    var token = WebSecurity.GeneratePasswordResetToken(userName);
    var resetLink = "<a href='" + Url.Action("ResetPassword", "Account", new {un = userName, rt = token}, "http") + "'>Reset Password</a>";
    //send the email
    return Json(new {result = "Email sent."});
}

これは正常に機能しますが、何らかの理由で [パスワードのリセット] リンクを使用しようとすると、ログイン画面にリダイレクトされ、Fiddler に 401-Unauthorized が表示されます。リンクをブラウザーのアドレス バーにコピー アンド ペーストし、アンカー タグを含むジャンク HTML ファイルを作成しようとしましたが、結果は依然として 401 です。 MVC4 テンプレート):

[HttpPost]
[AllowAnonymous]
public ActionResult ResetPassword(string un, string rt)
{
    var model = new ResetPasswordViewModel {UserName = un, ResetToken = rt};
    return View(model);
}

属性も削除しようとしましたHttpPostが、それも 401 になります。ここで何が欠けていますか?

更新
スティーブのコメントのおかげで、私は属性を完全に修飾し、ルートコントローラーHttpPostに直接ではなく、領域に投稿しようとしていることに気付きました. RouteDebuggerAccountを使用すると、リソースが見つからないというエラーが表示されます。

Matched Route: {controller}/{action}/{id}
Generated URL: /SiteRoot/Reports/Account/ResetPassword?un=whatever&rt=removedForSecurity using the route "Reports/{controller}/{action}/{id}"

領域を見ていることに注意してくださいReports。そこで、次のように、ルート値オブジェクトに仕様をForgotPassword追加して、アクションのアンカー タグの構造を変更しました。Area

var resetLink = "<a href='" + Url.Action("ResetPassword", "Account", new {un = userName, rt = token, Area = ""}, "http") + "'>Reset Password</a>";

しかし、それはまだその領域を使用しようとしていReportsます。電子メールのアンカー タグがエリアではなくサイト ルートに確実に誘導されるようにするにはどうすればよいですか?

更新 2
属性 を削除しHttpPost、元の 401 リダイレクトを取得しています。

更新 3 ResetPasswordビュー コード:

@model Whatever.Web.Models.ResetPasswordViewModel
@{
    ViewBag.Title = "Reset Password";
}
@using (Html.BeginForm())
{
    <fieldset>
        <legend>Reset Password</legend>
        <table>
            <tr>
                <td>User name:</td>
                <td>@Html.TextBoxFor(m => m.UserName, new { @class="disabled-textbox", @readonly="readonly", autocomplete="off" })</td>
                <td></td>
            </tr>
            <tr>
                <td>New Password:</td>
                <td>@Html.PasswordFor(m => m.NewPassword, new { id = "resetPasswordNewPassword" })</td>
                <td></td>
            </tr>
            <tr>
                <td>Confirm New Password:</td>
                <td>@Html.Password("resetPasswordConfirmPassword", "", new { id = "resetPasswordConfirmPassword"})</td>
                <td>
                    <div id="passwordsMatch"></div>
                </td>
            </tr>
        </table>
        <input type="submit" id="submitButton" value="Submit" disabled="disabled"/>
        <div id="resetPasswordResultDiv"></div>
    </fieldset>
}
<script type="text/javascript">
    $(document).ready(function() {
        $("#resetPasswordNewPassword, #resetPasswordConfirmPassword").keyup(function() {
            if ($("#resetPasswordNewPassword").val().length > 0 && $("#resetPasswordConfirmPassword").val().length > 0 && $("#resetPasswordNewPassword").val() != $("#resetPasswordConfirmPassword").val()) {
                if ($("#resetPasswordNewPassword").val() != $("#resetPasswordConfirmPassword").val()) {
                    $("#passwordsMatch").html('<span style="color: red; font-weight: bold;>Passwords do not match</span>');
                    $("#submitButton").attr('disabled', true);
                } else {
                    $("#submitButton").removeAttr('disabled');
                }
            } else {
                $("#passwordsMatch").html('');
                $("#submitButton").attr('disabled', true);
            }
        });
    });
</script>

更新 4
「hello world」スタイルのビューになる別のアクション メソッドをアカウント コントローラーに追加しようとしました。もちろん追加[AllowAnonymous]属性。この方法では、ログインへの 401 リダイレクトも発生します。

4

2 に答える 2

2

この設定方法に問題はありません。ここで何か他のことが起こっている必要があります。_Layout.cshmtlファイルをチェックして、401を引き起こしている可能性のある他のアクションへの呼び出しがないことを確認してください。

この人も同様の問題を抱えていました:https ://stackoverflow.com/a/11046666/199913

于 2013-01-23T15:30:25.430 に答える
0

かなり確実 Area=""なはずですarea=""

于 2013-01-22T17:35:51.103 に答える