会话ASP.NET超时

时间:2015-06-02 14:31:57

标签: asp.net session cookies session-timeout

我在asp.net中遇到会话问题。我在网上搜索了一段时间,但无法找到它不起作用的原因。会议在几分钟后消失。这个项目不是由我自己创建的,我不是aspx中的英雄。但我试图解决这个问题。

的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>

检查是否登录了您必须登录的页面      if(!functions.isLoggedIn(Session))                 {                     的Response.Redirect(&#34; Default.aspx的&#34);                 } 功能

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函数

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?通常我在PHP中使用cookie,但是有没有办法在ASP.NET中以安全的方式进行?

4 个答案:

答案 0 :(得分:0)

嗯,我建议你在asp.net中使用profile而不是session。

答案 1 :(得分:0)

您的方案中有两个方面。您有身份验证和会话。这是两件不同的事情。

您在web.config中管理的会话存储了一个超时为120分钟(2小时)的值

但身份验证在web.config中也有一个配置部分。 https://msdn.microsoft.com/en-us/library/532aee0e%28v=vs.85%29.aspx

那么你想先做什么?

答案 2 :(得分: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");
    }

在此示例中,您有:

  • 更新用户个人资料以设置最后一个连接日期,如果您想要...
  • 以自定义方式为此示例创建身份验证Cookie
  • 根据用户类型重定向到主页

那么,您是否有类似的方法来验证应用程序中的用户?

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

答案 3 :(得分:-2)

只是一个建议...你有任何重新指示(Response.Redierct)差异。网站或尝试访问您无权访问的资源?会议将在这些情况下到期。

相关问题