web-dev-qa-db-ja.com

ASP.net MVC 4グローバル承認フィルターは、AllowAnonymousアクションでログインを強制します

.NET MVC 4では、コントローラーを保護するためにグローバルフィルターを追加しています。これは、以下を使用して行われます。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new HandleErrorAttribute());
   filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}

これは私のGlobal.csクラスから呼び出されます。

私のWeb.configファイルには標準構成が含まれています:

<authentication mode="Forms">
     <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

私のログインアクションは、匿名ユーザーがログインできるようにするために[AllowAnonymous]で装飾されています。

これまでのところ、すべてがうまく機能しています。これが私のログインアクションです:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

ここで、匿名ユーザーがログインページを利用できるようにするパスワードリセットページを追加したいと思いました。私は(ログインアクションの同じコントローラーの下で)アクションを作成し、それを[AllowAnonymous]装飾で装飾しました。

[AllowAnonymous]
public ActionResult ResetPasswordForUser(string message = "")
{
    ViewBag.message = message;
    return View();
}

次に、対応するビューを作成しました。

このリンクをログインページに追加しました:

@Html.ActionLink("Forgot your password?", "ResetPasswordForUser", "Account")

実行時に、匿名ユーザーを使用してこのリンクをクリックすると、ResetPasswordForUserアクションが表示されますが、ビューに戻ると、ログインアクションが呼び出され、実際に目的のビューにアクセスできません。 [AllowAnonymous]装飾を使用しているのに、何らかの理由でリクエストが傍受されます。

ここで何かが足りませんか?

前もって感謝します

pdate1:​​

Darin Dimitrovのリクエストに従って、ResetPasswordForUserビューを追加します。

@using TBS.Models
@model TBS.ViewModels.ResetPasswordForUserViewModel

@{
    ViewBag.Title = "Reset Password";
}

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

    <table class="edit-table rounded bordered" style="width: 400px">
        <tr>
            <td class="label-td">
                @Html.LabelFor(m => m.Username)
            </td>
            <td>

                @Html.TextBoxFor(m => m.Username)
                @Html.ValidationMessageFor(model => model.Username)
            </td>
        </tr>
        <tr>
            <td class="label-td">
                @Html.LabelFor(m => m.Password)
            </td>
            <td>
                @Html.Password("Password")
                @Html.ValidationMessageFor(model => model.Password)
            </td>
        </tr>
        <tr>
            <td colspan="2" style="text-align: center">
                <input type="submit" value="Reset" />
            </td>
        </tr>
    </table>
}
19
forhas

ResetPasswordForUserビューで使用される_Layoutファイルが、AllowAnonymousで装飾されていないコントローラー内のアクション(メニューなど)を呼び出している可能性はありますか?

これにより、このタイプの動作が発生します。

11

レイアウトに匿名でない@ Html.ActionまたはHtml.RenderActionが含まれている可能性があるため、ページがログインにリダイレクトされているようです。

編集:古い回答は正しくなく、見に来る人には役に立たなかったため、削除しました。

3
Dan VanWinkle

そのグローバル認証フィルターを追加すると、AllowAnonymousと競合するかどうかはわかりません。プロジェクトを設定する方法は、コントローラーレベルで[Authorize]属性が設定されたBaseControllerを使用することです。

匿名アクセスが必要なコントローラー(通常はAccountControllerとMarketingController)を除いて、すべてのコントローラーはこのBaseControllerを継承します。それらは単にコントローラーから継承し、アクションレベルで[承認]を設定できます。

1
Tutan Ramen