Cookie过期或会话超时太快

时间:2014-10-08 12:54:50

标签: asp.net-mvc session forms-authentication session-cookies

我有这样的代码,在用户获得授权时运行:

 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                 1,
                 email,
                 DateTime.Now,
                 DateTime.Now.AddMinutes(120),
                 true,
                 userData);

        string encTicket = FormsAuthentication.Encrypt(authTicket);
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        faCookie.Expires = authTicket.Expiration;
        Response.Cookies.Add(faCookie);

然后我重定向到具有Authrize属性的控制器/ Action:

 [Authorize]
    public class ProductsController : Controller
    {

我在web.config中有以下内容:

 <authentication mode="Forms">
      <forms loginUrl="~/Home/Unauthorized" timeout="2880" />
    </authentication>
    <sessionState timeout="120"></sessionState>

然而,用户抱怨会话超时或在几分钟不活动后重定向家庭/未经授权。

可能导致这种情况,我还应该检查什么?

3 个答案:

答案 0 :(得分:18)

在我为您的登录过期的可能解决方案之前提出几点想法。首先,FormsAuthentication cookie和SessionState完全是两个不同的东西。您可以拥有一个或另一个,或两者兼而有之。因此,这两个项目的超时也没有关系。

FormsAuthentication cookie是一个加密的cookie,包含一些基本信息,例如用户名和到期值。一旦用户通过身份验证,.NET应用程序就会使用此cookie,以了解用户是否已获得某些资源的授权。

控制FormsAuthentication cookie的加密和解密的是IIS上的该Web应用程序的MachineKey。 MachineKey是一组用于加密和解密cookie的密钥。默认情况下,IIS上的Web应用程序设置为AutoGenerate机器密钥。这意味着当应用程序启动时,会生成随机机器密钥。如果应用程序回收,您将获得一个新的机器密钥。此外,如果您在共享提供程序上托管,则Web主机通常会使您的应用程序负载平衡,这意味着由多个服务器托管。这些服务器中的每一个都将自动生成机器密钥。

如果您的Web应用程序处于负载平衡方案,则Web场中的每台计算机都无法解密另一台加密的Cookie。这将给出“被注销”的外观。这样的示例是登录Web服务器A,然后后续请求转到Web服务器B. Web服务器B不与Web服务器A共享机器密钥,并且无法解密cookie,将用户发送回登录页面。

解决方案是在web.config中定义MachineKey部分,这样IIS的每个实例都将使用相同的密钥,如果应用程序池循环使用,您仍然拥有相同的机器密钥。

这可能是你可以放在web.config中的example machine key(使用.NET 2.0版本)

<system.web>
  <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web>

其他想法是你的web.config(2880)到期以及实际设置的到期时间(120)不匹配。您可能希望它们都匹配。

答案 1 :(得分:0)

如果您在负载均衡器后面运行,则需要确保Web场使用Tommy的答案所指出的一致密钥。

要检查的其他事项是每个服务器的IIS配置数据库设置是相同的。他们需要具有相同的路径和ID。

您还需要查看暂停会话(您的web.config看起来像在proc中),这会导致网络中断和随机应用程序回收。

基本上是此链接的摘要。 http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

如果您可以发布更多的配置,并提供有关环境设置的更多详细信息,那么您将更容易指向更有针对性的方向。

答案 2 :(得分:0)

试试这个:

web.config代码:

    <system.web>
         <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" />
         <authentication mode="Forms">
               <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" />
          </authentication>    
    </system.web>

这会对你有帮助。