asp.net mvc: TempData и AuthorizeAttribute
В продолжение этого вопроса мне интересно, что происходит с моими TempData.
Сценарий 1:
- пользователь входит в систему
- пользователь предоставляет адрес электронной почты
- пользователь получает письмо с кодом подтверждения
- пользователь нажимает на ссылку проверки
- пользователь подтвержден
- Успешное сообщение отображается с помощью TempData, установленной в действии Validate
Сценарий 2:
- пользователь входит в систему
- пользователь предоставляет адрес электронной почты
- пользователь выходит из системы / время ожидания
- пользователь получает письмо с кодом подтверждения
- пользователь нажимает на ссылку проверки
- пользователь подтвержден
- Успешное сообщение не отображается через TempData, установленное в действии Validate
Теперь я не вижу причины для входа пользователя в систему для проверки. В сценарии 1 я помещаю сообщение "Success" в TempData и возвращаю RedirectToAction("Index"). Индексное действие имеет атрибут AuthorizeAttribute - если они не вошли в систему, они перенаправляются на экран входа в систему (отдельный контроллер).
Я хотел бы, чтобы на экране входа отображалось мое сообщение, но в этом случае данные TempData очищаются. Я неправильно понимаю жизненный цикл TempData? Это относится только к запросам в пределах одного контроллера?
2 ответа
Проблема заключается в том, что AuthorizeAttribute вводит другое перенаправление в цикл, если пользователь не вошел в систему. Вы перенаправляете пользователя на другое действие, а затем, если пользователь не вошел в систему, AuthorizeAttribute перенаправляет их на страницу входа. TempData живет только в течение одного цикла запроса, поэтому дополнительный редирект (запрос) очищает его, и он не доступен на странице входа в систему.
Вы можете просто поместить его в сеанс напрямую, а не в интерфейсную часть TempData для сеанса. Он должен быть там до тех пор, пока живёт Сессия.
[Authorize]
вводит дополнительный редирект, который очищает TempData
(Tvanfosson объяснил детали). Таким образом, чтобы это работало, вы можете использовать флаг в методе, к которому вы перенаправляете, например
return RedirectToAction("Confirm", new { status = "Success!" });
(учитывая, что у вас есть следующий маршрут и объявленный метод действия:)
routes.MapRoute("Confirmation",
"Account/Confirm/{status}",
new { controller = "Account", action = "Confirm", status = "" });
public ActionResult Confirm(string status)
{
return View(status);
}