使用HTTPCookie的ASP.NET Webforms站点在20分钟后超时100年

时间:2010-06-11 20:20:28

标签: asp.net session-timeout httpcookie

我有一个使用Forms Auth的网站。客户端不希望站点会话对用户完全过期。在登录页面代码隐藏中,使用以下代码:

// user passed validation
FormsAuthentication.Initialize();

// grab the user's roles out of the database 
String strRole = AssignRoles(UserName.Text);

// creates forms auth ticket with expiration date of 100 years from now and make it persistent
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1,
  UserName.Text, DateTime.Now,
  DateTime.Now.AddYears(100), true, strRole,
  FormsAuthentication.FormsCookiePath);

// create a cookie and throw the ticket in there, set expiration date to 100 years from now
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
  FormsAuthentication.Encrypt(fat)) { Expires = DateTime.Now.AddYears(100) };

// add the cookie to the response queue
Response.Cookies.Add(cookie);

Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text, false));

web.config文件auth部分如下所示:

<authentication mode="Forms">
      <forms name="APLOnlineCompliance" loginUrl="~/Login.aspx" defaultUrl="~/Course/CourseViewer.aspx" />
</authentication>

当我登录网站时,see正确地将cookie发送到浏览器并传回:

HttpFox output http://cid-e79f8e4b07c3e30f.office.live.com/embedphoto.aspx/Public/SessionProblem.png

然而,当我走开20分钟左右时,回来尝试在网站上做任何事情,登录窗口再次出现。这个解决方案在我们的服务器上运行了一段时间 - 现在又回来了。在VS2008中运行Cassini的本地开发盒中不会出现此问题。

有关如何解决此问题的任何想法?

5 个答案:

答案 0 :(得分:2)

会话超时和表单身份验证超时是两个不同的事情。会话超时是否设置为20分钟,是否会在Global.asax文件中的Session_End事件中将您的用户记录下来?

答案 1 :(得分:1)

默认情况下,IIS 6中的应用程序池设置为在不活动20分钟后关闭。如果您的应用配置中没有任何内容导致您的应用快速关闭,请检查IIS管理器中的应用池配置。你可以在那里设置许多精彩的旋钮。

答案 2 :(得分:0)

我在Global.asax中有以下内容:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        //Fires upon attempting to authenticate the use
        if (!(HttpContext.Current.User == null))
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity.GetType() == typeof(FormsIdentity))
                {
                    FormsIdentity fi = (FormsIdentity) HttpContext.Current.User.Identity;
                    FormsAuthenticationTicket fat = fi.Ticket;

                    String[] astrRoles = fat.UserData.Split('|');
                    HttpContext.Current.User = new GenericPrincipal(fi, astrRoles);
                }
            }
        }
    }

这就是你指的是什么?此外,如果这有任何区别,我们将处于IIS6环境中。

答案 3 :(得分:0)

另一个快速检查的可能是您的托管类型。云托管通常会有一个负载平衡器,硬盘设置为保持相同的IP指向节点服务器大约20分钟,但是在此之后,您可能会被推送到新服务器上,在新服务器上创建新会话并“记录您出'

如果你的标准共享主机或单个专用服务器或虚拟服务器,但这不是问题:)

要解决这个问题并保持asp.net会话正常工作,您需要将会话状态移动到数据库 - 或者重新设置代码以使用会话:)

答案 4 :(得分:0)

您可能想要检查是否使用负载均衡器。如果是这样,那么你真的不应该存储InProc。如果您有多个实体,应该查看状态服务器或SQL服务器。

根据这个问题,似乎没有遵守30分钟的默认值,这通常指向IIS /主机/网络配置。