2014-11-03 4 views
2

Я использую в своем приложении Session для хранения некоторых данных, таких как имя пользователя (для написания приветствия, ...) и т. Д. Кроме того, я использую 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

cookies сохраняются через сеансы. в чем проблема? когда вы обнаруживаете файл cookie, задайте значения сеанса. – DLeh

+2

также, использование сеанса не рекомендуется с помощью MVC. MVC должен быть как можно более безграждан, и полагаться на сеанс нарушит это. – DLeh

+0

Иногда пользователь аутентифицируется, но данные сеанса больше не существуют. Это происходит, когда я перезапускаю приложение после изменений кода, и я боюсь этой ситуации в другом случае – lenden

ответ

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

+0

Я так думаю, если вы знаете userId (int userId), чтобы пополнить его ... –

+0

Да, я могу сохранить его в User.Identity.Name, спасибо – lenden