asp.net mvc: TempData и AuthorizeAttribute

В ответ на этот вопрос мне интересно, что происходит с мои TempData.

Сценарий 1:

  • пользователь входит в систему
  • пользователь предоставляет адрес электронной почты
  • пользователь получает электронное письмо с кодом подтверждения
  • пользователь нажимает на URL-адрес проверки
  • пользователь проверен
  • сообщение об успешном завершении отображается через TempData, установленную в действии Validate.

Сценарий 2:

  • пользователь входит в систему
  • пользователь предоставляет адрес электронной почты
  • пользователь выходит из системы / время ожидания
  • пользователь получает электронное письмо с кодом подтверждения
  • пользователь нажимает на URL-адрес проверки
  • пользователь проверен
  • сообщение об успешном завершении не отображается через TempData, установленную в действии Validate.

Теперь я не вижу причин для входа пользователя в систему для проверки. В сценарии 1 я помещаю сообщение «Успех» в TempData и возвращаю RedirectToAction («Индекс»). Действие индекса имеет атрибут AuthorizeAttribute - если они не вошли в систему, они перенаправляются на экран входа в систему (отдельный контроллер).

Я хотел бы, чтобы на экране входа в систему отображалось мое сообщение, но в этом сценарии TempData, похоже, очищается. Я неправильно понимаю жизненный цикл TempData? Применяется ли это только к запросам в пределах одного контроллера?


person chris    schedule 03.02.2010    source источник


Ответы (2)


Проблема в том, что AuthorizeAttribute вводит другое перенаправление в цикл, если пользователь не вошел в систему. Вы перенаправляете пользователя на другое действие, тогда, если пользователь не вошел в систему, AuthorizeAttribute перенаправляет его на страницу входа. TempData живет только в течение одного цикла запроса, поэтому дополнительное перенаправление (запрос) опустошает его и недоступно на странице входа.

Вы можете подумать о том, чтобы просто поместить его в сеанс напрямую, а не во внешний интерфейс TempData для сеанса. Он должен оставаться там, пока существует сессия.

person tvanfosson    schedule 03.02.2010

[Authorize] вводит дополнительное перенаправление, которое очищает TempData (Тванфоссон объяснил подробности). Итак, чтобы это работало, вы можете использовать флаг для метода, на который вы перенаправляете, например

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);
}
person Tomas Aschan    schedule 03.02.2010