给定时间之前的会话超时

时间:2012-11-19 17:32:35

标签: c# asp.net asp.net-mvc forms authentication

我正在使用Asp.Net MVC应用程序进行表单身份验证,如下所示:

代码

public void SignIn(string userName, bool isCookiePersistent)
        {

            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(14),
                createPersistentCookie, string.Empty);

            HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, isCookiePersistent);
            if (authTicket.IsPersistent)
            {
                authCookie.Expires = authTicket.Expiration;
            }

            authCookie.Value = FormsAuthentication.Encrypt(authTicket);
            HttpContext.Current.Response.Cookies.Add(authCookie);
        }

public void SignOut()
        {
            FormsAuthentication.SignOut();
        }

问题: 问题是,如果我将表单身份验证超时设置为4小时,我的用户仍然会在登录后半小时重定向到登录页面。

我已尝试在web.config中包含SessionSate或执行SessionState,但注意事项正在发生。问题仍然存在。这是我的web.cofig代码。

Web.config(没有sessionState元素)

  <authentication mode="Forms">
      <forms loginUrl="~/LogOn/LogOn" requireSSL="false" timeout="240" defaultUrl="~/Home/Home" name="__appcookie" path="/" slidingExpiration="true" ticketCompatibilityMode="Framework40" protection="All">
      </forms>
    </authentication>

Web.config(WITH sessionState element)

<sessionState timeout="240"></sessionState>
 <authentication mode="Forms">
          <forms loginUrl="~/LogOn/LogOn" requireSSL="false" timeout="240" defaultUrl="~/Home/Home" name="__appcookie" path="/" slidingExpiration="true" ticketCompatibilityMode="Framework40" protection="All">
          </forms>
        </authentication>

有人可以告诉我,在web.config中加入sessionStatesessionTimeout非常重要吗?我不能只在我的申请中使用formAuthentication吗?

无论我使用sessionState还是NOT,即使仅使用form authentication,我的用户在登录应用程序后半小时后重定向到登录页面。 (但我已将240分钟设为form authentication timeout)。

有人可以就此提出一些想法或解决方案。

提前致谢!

3 个答案:

答案 0 :(得分:1)

forms ticketCompatibilityMode="Framework40"指定票证到期日期存储为UTC。默认值为Framework20,指定票证到期日期存储为本地时间。如果您在使用DateTime.Now时手动设置FormsAuthenticationTicket到期日期,而您的ticketCompatibilityMode是Framework40,则您在本地和UTC(DateTime.NowDateTime.UtcNow)之间断开连接。

这最近让我感到困惑。请参阅this MSDN article for more information

答案 1 :(得分:0)

尝试在IIS中提升会话超时值。默认值为20分钟。您可以将web.config设置为在4年内使会话超时,但IIS会话超时将覆盖它。假设您的用户未在您的网站上有效...

答案 2 :(得分:0)

30分钟是表单身份验证cookie的默认时间,这让我相信您的配置有问题。您是否可以尝试简化配置以进行测试?

<authentication mode="Forms">
    <forms loginUrl="~/LogOn/LogOn" timeout="240" protection="All" />
</authentication>