2015-06-02 217 views
3

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

的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(会话)){ 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分钟后,我被重定向到登录表单。我能解决这个问题吗?如果我在本地主机上调试,它似乎工作,但不在线。

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

或者如果不可能,Cookie?通常我在PHP中使用Cookie,但是有没有办法在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

是的,我有重定向(检查用户是否登录(=会话集))。但它是在同一个网站的页面上,如果您使用Response.Redirect并尝试一下,登录表单页面(= default.aspx) – Finduilas

+0

可以将其更改为Server.Transfer。 – redsam

+0

Hmms,就像你可以在全球帖子中看到的那样,它只是在检查了会话之后。之前没有。 - > functions.isLoggedIn(Session)。 – Finduilas

0

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

会话,你是在存储的值与120分钟(2小时)

,但验证也有在web.config中配置部分超时你的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"); 
    } 

在此示例中,您有:

  • 更新用户设置最后连接日期,如果你希望别人的......在自定义
  • 创建身份验证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

我对用户进行身份验证的部分位于第3个代码块(全局帖​​子)中。我什么都没有? – Finduilas

+0

但是,身份验证不能仅仅是针对数据库对象的登录名/密码的检查。您必须保留身份验证令牌,并且必须使用FormsAuthentication完成此操作。请参阅EDIT1 – D4rkTiger

+0

所以我不使用身份验证,或者我错了吗?我做的唯一的事情就是在会话用户中存储g,并且我也有FormsAuthentication.HashPasswordForStoringInConfigFile – Finduilas