2015-04-03 170 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