2015-04-03 101 views
0

我有一个MVC4的web应用程序,当我在Visual Studio中运行它时,它在我的本地机器上完美工作。RedirectToAction后失去了Asp MVC会话

因此,我发布网站到服务器去与我的应用程序生活。 但是,当我尝试登录我的应用程序去下面的代码:

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

但问题是,会话变量不存在 和它总是发送回我的登录屏幕

我发现在设置会话后做重定向导致此行为,但我找不到解决此问题的答案...

所以我有一些关于它的问题:

  1. 它为什么我的本地机器上,而不是在服务器上运行?
  2. 我可以修改服务器设置以这种方式工作,我愿意做什么?它是否在重定向后回收东西?
  3. 我可以在本地机器上重现此行为,就像在服务器上使用某些设置一样?
  4. 必须有一个简单的方法来解决这个问题,或者我错了吗?我真的需要将会话变量存储在数据库中吗?
+1

永远不会有EVER EVER EVER用户会话进行身份验证...不要这样做。它是非常不安全的,并且不可靠(IIS可以在感觉时终止会话)。 ASP.NET提供了一种认证机制(实际上有几种),使用它们。 FormsAuthentication for MVC4。 – 2015-04-03 14:17:39

回答

1

如果您的集群服务器具有负载平衡功能,那么您可能需要在其上启用粘性会话,以便来自一个会话的所有请求都转到同一台服务器。

,如果您有服务器群集 答案:

1)当你存储在memeory会话,你要确保所有的请求都前往同一服务器,否则,你会得到关于服务器这个错误,但不是本地。

2)如果您只是在服务器上启用粘滞会话,则此错误可能会消失。

3)如果错误是由于聚类,那么你不能在本地重现它。

4)如果您无法在loadbalancer上启用粘性会话,那么您可能必须将会话存储到所有群集服务器都可访问的文件,或将其存储在数据库中。

+1

您的回答的第一部分是OP的问题,应该是一个评论。鉴于OP没有回答这个问题,你答案的第二部分是一个猜测,这也应该是一个评论。只有在问题明确时才回答,否则请使用评论。 – CodeCaster 2015-04-03 14:16:35

+0

当然我会从未来。谢谢 – pjobs 2015-04-03 14:19:15

+1

@CodeCaster - 虽然我同意提出的问题应该是一个评论,但你可以根据一个假设给出一定的答案。如“如果你正在做xxxx然后做这个”,这是一个答案,即使这不是一个好的回答这个问题,它可能回答其他人的问题谁发现这个问题的一部分,他们的搜索和资格它适用于什么帮助。 – 2015-04-03 14:20:14