Подтвердить что ты не робот

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>

Действие My Login украшено [AllowAnonymous], чтобы анонимные пользователи могли войти в систему.

Пока все хорошо, все отлично работает. Вот мое действие для входа:

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

Теперь я хотел добавить страницу reset -password, которая также точно так же, как страница входа должна быть доступна анонимным пользователям. Я создал действие (под тем же контроллером действия входа) и украсил его украшением [AllowAnonymous]:

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

Затем создайте соответствующее представление.

Я добавил эту ссылку на мою страницу входа:

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

Во время выполнения, когда я нажимаю эту ссылку с помощью анонимного пользователя, я получаю действие ResetPasswordForUser, но при возврате представления активируется действие Login, и я никогда не могу получить желаемое представление. По какой-то причине мой запрос перехватывается, хотя я использую украшение [AllowAnonymous].

Я что-то пропустил?

Заранее спасибо

Update1:

Как сообщает Дарин Димитров, добавьте мой взгляд 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>
}
4b9b3361

Ответ 1

Возможно ли, что файл _Layout, используемый представлением ResetPasswordForUser, вызывает действие в вашем контроллере (например, в меню?), которое не было украшено AllowAnonymous?

Это приведет к такому типу поведения.

Ответ 2

Похоже, у вас может быть не анонимный @Html.Action или Html.RenderAction в вашем макете, что приводит к перенаправлению вашей страницы на вход.

Изменить: Удаленный старый ответ, поскольку он был неправильным и не полезен для тех, кто придет к нему.

Ответ 3

Не знаю, будет ли конфликт глобального фильтра авторизации с AllowAnonymous. Способ, которым я настраивал свой проект, состоит в том, чтобы иметь базовый контроллер, который имеет атрибут [Авторизовать], установленный на уровне контроллера.

Все мои контроллеры наследуют этот BaseController, за исключением тех, которые требуют анонимного доступа, обычно мой AccountController и мой MarketingController. Они просто наследуют Controller, а затем я могу установить [Authorize] на уровне Action.