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);
}
Другие вопросы по тегам