2015-06-02 2 views
3

У меня проблемы с сеансами в asp.net. Некоторое время я искал веб-сайт, но не мог найти причину, по которой он не работает. Сессия исчезает через несколько минут. Это проект, который не создан мной, я не герой в aspx. Но я пытаюсь решить эту проблему.Сессии ASP.NET Timeout

Web.config

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Default.aspx" timeout="120" slidingExpiration="true" /> 
    </authentication> 

    <customErrors mode="RemoteOnly"/> 
    <httpRuntime requestValidationMode="2.0"/> 
    <pages validateRequest="false" /> 

    <sessionState mode="InProc" cookieless="false" timeout="120" /> 

    </system.web> 

Проверка Помнить на страницах, которые вы должны войти в систему, если (! Functions.isLoggedIn (Session)) { Response.Redirect ("Default.aspx"); } Функции

public static bool isLoggedIn(HttpSessionState session) 
     { 
      return session["user"] != null; 
     } 

не вошли? Показаны формы регистрации, заполнив форму, а затем отправить его на сервер, чтобы проверить функцию

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request["do"] != null) 
     { 
      switch (Request["do"]) 
      { 
       case "logout": 
        Session.Abandon(); 
        break; 
      } 
     } 
    if (Request.ServerVariables["REQUEST_METHOD"].ToLower() == "post") 
       { 
        //get username en password 
        string username = Request["username"]; 
        string password = Request["password"]; 
        if (String.IsNullOrWhiteSpace(username) || String.IsNullOrWhiteSpace(password)) 
        { 
         LoginMessage.Text = "Please fill in all the fields..."; 
        } 
        else 
        { 
         password = FormsAuthentication.HashPasswordForStoringInConfigFile(
           password, 
           "SHA1"); 
          UserService gs = new UserService(); 
          user g = gs.getUserByLogin(username, password); 
         if (g == null) 
         { 
          //wrong login 
          LoginMessage.Text = "Invalid username/password."; 
         } 
         else 
         { 
          //good login 
          Session["user"] = g; 
          System.Diagnostics.Debug.WriteLine("timeout:" + Session.Timeout); 
          Response.Redirect("Home.aspx"); 
         } 
        } 
    } 
} 

GetUserByLogin в UserService

public user getUserByLogin(string username, string password) 
     { 
      user g; 
      var db = new projectName.Db.Models.projectnetContext(); 

      IQueryable<user> query = from gb in db.users 
       where gb.username.Equals(username) 
         && gb.Passwoord.Equals(password.ToLower()) 
         && gb.Status == 1 
       select gb; 

      if (!query.Any()) 
       g = null; 
      else 
       g = query.First(); 

      return g; 
     } 

После входа в, создавая сеанс

Session["user"] = g; 

Моя проблема в том, что я установил тайм-аут. Но, похоже, это не работает. Если я проверю тайм-аут на сервере, он установлен на 120. Но через 2 минуты я перенаправлен на форму входа. Могу ли я решить это? Если я отлаживаюсь на localhost, он, похоже, работает, но не в сети.

Вход в систему работает. Сеанс установлен (иначе я не смог бы войти в следующие страницы). Если я перейду на другую страницу (быстрее +5 минут), то я все равно войду в систему. Таким образом, проблема репродуктивная.

Или, если это невозможно, Cookies? Обычно я работаю с файлами cookie на PHP, но есть ли способ сделать это в ASP.NET безопасным способом?

+0

В соответствии с вашими значениями сеанса конфигурации хранятся InProc так зависят также от w3wp.exe процесса. Если перезапустимые сеансы applicationPool были потеряны. – D4rkTiger

+0

Я не уверен, понимаю ли я это. После загрузки проекта на веб-сервер я снова вошел в систему. Но проблема остается. Начиная с загрузки на сервер, я ничего не изменил. – Finduilas

+0

Я давно написал эту статью, и я надеюсь, что она вам поможет ... http://aspalliance.com/1182_Troubleshooting_Session_Related_Issues_in_ASPNET –

ответ

0

Хм, я рекомендую вам использовать профиль вместо сеанса в asp .net.

-2

Просто совет ... у вас есть какие-либо переадресации (Response.Redierct) для разницы. сайтов или пытаться получить доступ к ресурсам, для которых у вас нет доступа? Сессия истекает в этих случаях.

+0

Да, у меня есть перенаправления (после проверки входа пользователя (= набор сеансов)). Но это страница на том же сайте, страница формы входа (= default.aspx) – Finduilas

+0

вы можете изменить ее на Server.Transfer, если вы используете Response.Redirect и попробуйте. – redsam

+0

Hmms, Как вы можете видеть в глобальном сообщении, это только после проверки сеанса. Не раньше, чем. -> functions.isLoggedIn (сеанс). – Finduilas

0

В вашем сценарии есть два аспекта. У вас есть аутентификация и сеанс. Это две разные вещи.

Session, что вы управлять в вашем web.config хранится значение тайм-ауту, 120 минут (2 часа)

Но Authentication также раздел конфигурации в файле web.config. https://msdn.microsoft.com/en-us/library/532aee0e%28v=vs.85%29.aspx

Итак, что вы хотите сделать в первую очередь?

+0

Я уже использовал аутентификацию в web.config , Теперь я добавил его на глобальную должность. Тайм-аут этого также был установлен на 120. – Finduilas

+1

Хорошо, но как вы аутентифицируете пользователя? Вы больше не публикуете какой-либо код ... Можете ли вы опубликовать этот код? – D4rkTiger

+0

Я добавил дополнительный код. Что происходит после заполнения формы входа в систему, ... Еще что-то не хватает? – Finduilas

0

Просьба найти этот образец метода действия контроллера MVC.

// POST: /Secure/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginFormModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.Login, model.Password)) 
      { 
       using (var db = new DatabaseEntities()) 
       { 
        var user = db.Users.Single(u => u.Login == model.Login); 

        Membership.UpdateUser(new MembershipUser("UserMembershipProvider", user.Login, null, null, null, null, true, false, DateTime.MinValue, DateTime.Now, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue)); 

        #region Create Authentication Cookie 

        Response.Cookies.Add(MyAppFormAuthenticationCookie.Create(user, model.RememberMe)); 

        #endregion 

        if (!string.IsNullOrWhiteSpace(returnUrl)) 
        { 
         return Redirect(HttpUtility.UrlDecode(returnUrl)); 
        } 

        if (model.UserFormType == UserType.Candidate) 
        { 
         return RedirectToAction("Index", "Dashboard", new { area = "Candidate" }); 
        } 

        if (model.UserFormType == UserType.Recruiter) 
        { 
         return RedirectToAction("Index", "Dashboard", new { area = "Recruiter" }); 
        } 

        if (model.UserFormType == UserType.SuperAdmin || model.UserFormType == UserType.Admin) 
        { 
         return RedirectToAction("Index", "Dashboard", new { area = "Admin" }); 
        } 
       } 
      } 

      ModelState.AddModelError("", "Incorrect username and/or password"); 
      return View("Index", model); 
     } 

     return RedirectToAction("Index", "Home"); 
    } 

В этом примере, у вас есть:

  • UPDATE в профиле пользователя, чтобы установить дату последнего соединения и другие, если вы хотите ...
  • СОЗДАНИЯ куки аутентификации в пользовательском способ для этого образца
  • Переквалификация на домашнюю страницу в соответствии с типом пользователя

Итак, у вас есть аналогичный подход для аутентификации пользователя в вашем приложении?

EDIT1:

Обычно вы должны завершить процесс аутентификации что-то вроде этого:

 var authTicket = new FormsAuthenticationTicket("MyAuthTicket", rememberMe, timeout: 120); 
     var encryptAuthTicket = FormsAuthentication.Encrypt(authTicket); 
     Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptAuthTicket) { Expires = authTicket.Expiration }); 
+0

Часть, где я аутентифицирую пользователя, находится в блоке 3-го кода (глобальная почта). У меня больше нет? – Finduilas

+0

Но аутентификация не может быть просто проверкой входа/пароля в отношении объекта базы данных. Вы должны сохранить токен аутентификации, и это должно быть сделано благодаря FormsAuthentication. Пожалуйста, см. EDIT1 – D4rkTiger

+0

. Поэтому я не использую аутентификацию, или я ошибаюсь? Единственное, что я делаю, это хранить g в пользователе сеанса, и у меня также есть FormsAuthentication.HashPasswordForStoringInConfigFile – Finduilas

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