首页 文章

会话ASP.NET超时

提问于
浏览
3

我在asp.net中遇到了会话问题 . 我在网上搜索了一段时间,但找不到它无效的原因 . Session 在几分钟后消失 . 这是一个不是我自己创建的项目,我不是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>

Checking if Logged in on the pages that you have to be logged in if(!functions.isLoggedIn(Session)){Response.Redirect("Default.aspx"); } Functions

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

Not logged in ? Showing login form, filling in the form and then send it to server to check

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 function in 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;
        }

After login in, creating the session

Session["user"] = g;

我的问题是我设置了超时 . 但它似乎不起作用 . 如果我检查服务器上的超时,它将设置为120.但是2分钟后,我被重定向到登录表单 . 我能解决这个问题吗?如果我在localhost上调试,它似乎工作,但不在线 .

登录有效 . 会话已设置(否则我无法进入下一页) . 如果我去另一页(更快,然后-5分钟),那么我仍然登录 . 所以问题是生殖 .

或者,如果不可能,Cookies?通常我在PHP中使用cookie,但是有没有办法在ASP.NET中以安全的方式完成它?

4 回答

  • 0

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

  • 0

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

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

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

    那么你想先做什么呢?

  • -2

    请找到这个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 });
    
  • 0

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

相关问题