2015-04-03 3 views
0

У меня есть веб-приложение MVC4, которое отлично работает на моем локальном компьютере, когда я запускаю его в Visual Studio.Asp MVC сессия потеряна после RedirectToAction

Таким образом, я публикую веб-сайт для сервера, чтобы перейти в прямом эфире с моим приложением. Но когда я пытаюсь войти в мое приложение переходит к следующему коду:

[HttpPost] 
public ActionResult CheckLogin(LoginViewModel vm) 
{ 
    if (!String.IsNullOrWhiteSpace(vm.UserName) && !String.IsNullOrWhiteSpace(vm.Password)) 
    { 
      User u = ... 
      // Get user from database with credentials 

      System.Web.HttpContext.Current.Session.Add("UserIdSession", u.Id); 
      return RedirectToAction("Validate", "Overview"); 
    } 
    else 
    { 
     // process the error that the login failed 
    } 
} 

Перенаправление переходит к следующему действию:

[HttpGet] 
    public ActionResult Validate() 
    { 
     if (HttpContext.Current.Session["UserIdSession"] != null) 
     { 
      return View(); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Login"); 
     } 
    } 

Но проблема в том, что переменная сессии не существует и он всегда отправляет меня обратно на loginscreen

Я обнаружил, что выполнение перенаправления после установки сеанса вызывает подобное поведение, но я не смог найти ответ для решения этой проблемы ...

Поэтому у меня есть несколько вопросов о нем:

  1. Почему это работает на моей локальной машине, а не на сервере?
  2. Могу ли я изменить настройки сервера, чтобы работать таким образом, что я намерен делать? Перерабатывает ли он после перенаправления?
  3. Могу ли я воспроизвести это поведение на своей локальной машине, как на сервере, с некоторыми настройками?
  4. Должен быть простой способ решить эту проблему или я ошибаюсь? Нужно ли мне хранить переменные сеанса в базе данных или что-то в этом роде?
+1

НИКОГДА НИКОГДА КОГДА-ЛИБО НИКОГДА пользовательский сеанс для целей аутентификации ... не делайте этого. он очень небезопасен и ненадежен (IIS может убивать сессию всякий раз, когда это кажется). ASP.NET предоставляет механизм аутентификации (несколько на самом деле), используйте их. FormsAuthentication для MVC4. –

ответ

1

У вас есть кластерные серверы с балансировкой нагрузки, если да, то вы можете включить липкий сеанс на нем, чтобы все запросы с одного сеанса переходили на один и тот же сервер.

, если у вас есть серверные кластеры Ответы:

1) При сохранении сессии в Memeory, вы хотите, чтобы убедиться, что все запросы идет на тот же сервер, в противном случае вы получите эту ошибку на сервере, но не местные ,

2) Если вы включили только липкую сессию на сервере, эта ошибка может исчезнуть.

3) Если ошибка связана с кластеризацией, вы не можете воспроизвести ее на локальном компьютере.

4) Если вы не можете включить липкую сессию на loadbalancer, вам может потребоваться сохранить сеанс в файл, доступный для всех кластерных серверов, или сохранить его в db.

+1

Первая часть вашего ответа - это вопрос OP, который должен быть комментарием. Учитывая, что ОП не ответил на вопрос, вторая часть вашего ответа - это догадка, которая также должна быть комментарием. Ответьте только тогда, когда проблема ясна, используйте комментарии иначе. – CodeCaster

+0

уверен, что я буду дальше. спасибо – pjobs

+1

@CodeCaster - Хотя я согласен с тем, что задавать вопросы должен быть комментарий, вы можете получить определенный ответ на основе гипотезы ..например «Если вы делаете xxxx, тогда сделайте это», это ответ, и даже если это не будет хорошим ответом на этот вопрос, он может ответить на другие вопросы людей, которые находят этот вопрос в рамках своего поиска и квалификации к чему это относится. –

Смежные вопросы