Я пытаюсь создать форму входа для моего проекта MVC 5. У меня уже работает аутентификация, поэтому мой контроллер украшен [Authorize]
. Когда я запускаю свой проект, я справедливо направляю свое анонимное действие для входа:
[HttpGet]
[AllowAnonymous]
public ActionResult Login()
{
return View();
}
В этом представлении я установил форму POST. Сгенерированный HTML выглядит отлично.
Затем я добавляю новый метод, который должен принять форму отправки:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(FormCollection formCollection)
{
...
Я обнаружил, что когда я отправляю форму, мой первый метод Login
вызывается - видимо, перенаправление, вызванное некоторыми проблемами проверки подлинности. (Трассировка Fiddler показывает, что моя форма, в то время как POST, отправляется в /Login? Key = myKeyHere вместо того, чтобы быть POSTed в /Login с ключом = myKeyHere как записью формы. Кроме того, если я изменю URL-адрес перенаправления моей аутентификации из //SomethingElse, представление формы меня перенаправляет на /SomethingElse вместо отправки его в /Login.)
Если я удалю [Authorize]
с моего контроллера, моя подача формы проходит через отлично.
Это не похоже на то, что мои два метода имеют одно и то же имя (Login
), так как я могу переименовать метод, который принимает POST, изменить действие моей формы и отправить на него, и я перенаправлен на мой логин GET снова.
Что мне нужно сделать, чтобы отправить форму методу [AllowAnonymous]
?
Обновление для включения моего представления " Мой взгляд" уже использует действие POST:
@using (Html.BeginForm("Login", "Home", FormMethod.Post))
{
@Html.TextBox("key", string.Empty, new { @class = "input_centered", id = "key_text"})
<input type="submit" id="key_submit" class="enter" name="submit" value="Enter" />
}
Сгенерированный HTML выглядит хорошо:
<form action="/Login" method="post">
<input class="input_centered" id="key_text" name="key" type="text" value="" />
<input type="submit" id="key_enter" class="enter" name="submit" value="Enter" />
Проблема в том, что вы используете объект FormCollection, он слишком широк, и MVC-движок не может создавать или сопоставлять (де-сериализовать) ваши опубликованные данные с объектом FormCollection, поэтому не может найти никакого подходящего действия для сообщения. Попробуйте преобразовать свой FormCollection в сериализуемый объект.
например.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model)
[Authorize]
атрибут [Authorize]
. Почему это проблема сложности?
Форма входа в систему - это просто сбор данных, чтобы разрешить вам авторизацию. Когда вы отправляете форму, она переходит к методу POST (с атрибутом [Authorize]
), видит, что вы еще не авторизованы (на этом этапе не был вызван какой-либо метод для авторизации) и сразу перенаправляет вас на страницу входа в систему, создавая бесконечный цикл.
Для вашего метода POST требуется [AllowAnonymous]
а затем в этом методе вы выполняете логику авторизации. С этого момента вы авторизуетесь и можете получить доступ к другим методам действий, отмеченным с помощью [Authorize]
.
public ActionResult Login(FormCollection formCollection)
) установлены как [AllowAnonymous]
. Возможно это не регистрируется как-то?