asp.net mvc: TempData и AuthorizeAttribute - PullRequest
       4

asp.net mvc: TempData и AuthorizeAttribute

1 голос
/ 03 февраля 2010

В качестве продолжения этого вопроса мне интересно, что происходит с моими TempData.

Сценарий 1:

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

Сценарий 2:

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

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

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

Ответы [ 2 ]

6 голосов
/ 03 февраля 2010

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

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

3 голосов
/ 03 февраля 2010

[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);
}
...