2014-11-03 113 views
2

我在我的應用程序中使用Session來存儲一些數據,如用戶名(寫hello,...)等等。另外,我使用FormsAuthentication驗證用戶,所以控制器有這樣的代碼:在asp.net中存儲會話數據mvc

protected void SetAuthCookie(int userId) 
    { 
     FormsAuthentication.SetAuthCookie(userId.ToString(), true); 
     User user = Repositories.UserRepository.GetUserById(userId); 

     Session["name"] = user.Name; 
     Session["email"] = user.Email; 
     Session["balance"] = user.TotalBalance + "/" + user.ActiveBalance; 
     Session["isConfirmed"] = user.IsConfirmed; 
     Session["phone"] = user.Phone; 
    } 

所以,當我的一些代碼後重新啓動應用程序改變會話數據被破壞,但用戶通過身份認證,所以我有很不好的情況,我想解決它。一方面,我可以在某處創建代碼,這將檢查會話數據是否正常,否則刷新它。另一方面,我可能會錯過一些以正確的方式存儲這些數據的技術嗎?

在這種情況下最好的解決方案是什麼?


<sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
    <providers> 
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
    </providers> 
</sessionState> 
+1

Cookie在會話中持續存在。這裏有什麼問題?當您檢測到cookie時,請設置會話值。 – DLeh 2014-11-03 13:24:08

+2

另外,使用會話不建議與MVC。 MVC意味着儘可能無狀態,依靠會話將打破這一點。 – DLeh 2014-11-03 13:25:15

+0

有時,用戶通過身份驗證,但會話數據不再存在。發生這種情況,當我在代碼更改後重新啓動應用程序時,在其他情況下我害怕這種情況 – lenden 2014-11-03 13:25:41

回答

2

我也有過類似的問題解決了像這樣的的global.asax.cs文件:它會強制註銷如果會話是空的,並且請求進行身份驗證。 (將您的會話值之一始終設置爲檢查爲空)

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     ForceLogoutIfSessionExpired(); 
    } 

    private void ForceLogoutIfSessionExpired() 
    { 
     if (Context.Handler is IRequiresSessionState) 
     { 
      if (Request.IsAuthenticated) 
      { 
       if (HttpContext.Current.Session["name"] == null) 
       { 
        AuthenticationHandler.SignOut(Response); 
        Response.Redirect(FormsAuthentication.LoginUrl, true); 
       } 
      } 
     } 
+0

謝謝你的想法Application_PreRequestHandlerExecute,我認爲這是我需要的。但是,如果它是空的,我更願意重新填充會話數據,但不註銷用戶,這也是正常計劃,不是嗎? – lenden 2014-11-03 13:59:27

+0

我想是的,只要你知道userId(int userId)來填充它... – 2014-11-03 14:15:39

+0

是的,我可以將它存儲在User.Identity.Name中,謝謝 – lenden 2014-11-03 14:19:55