2012-03-21 73 views
3

我刚刚推出了我的第一个MVC3应用程序,除Cookies授权外,一切正常。当用户访问我的网站并登录时,我使用关于该用户的数据设置了一个.ASPAUTH cookie。它运行良好,直到一段时间过去。然后,即使该Cookie位于浏览器中,我也必须再次登录,并且可以看到过期设置为一年后。它在我的本地主机上正常工作。 在我看来,它不是将我的信息设置为cookie,而是以某种方式在会话中,但即使我在一小时内重新启动计算机,我仍然登录。但如果我在1小时内未访问网站,我退出了。MVC3不接受cookie

感谢您的任何帮助。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, 
       requestedUser.Name, 
       DateTime.Now, 
       DateTime.Now.AddYears(1), 
       true, 
       string.Format("{0};{1};{2}", requestedUser.IDUser.ToString(), requestedUser.IsAdmin.ToString(), profilePicture)); 

      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      cookie.Expires = keepLogged == "keepLogged" ? DateTime.Now.AddYears(1) : DateTime.Now.AddHours(1); 

      this.Response.Cookies.Add(cookie); 
      return RedirectToAction("Index", "Posts"); 
+0

应用程序池重新启动可能是由于空闲超时导致会话cookie无效 - 请参阅http://stackoverflow.com/questions/4277944/ is-it-it-to-recycle-iis-application-pools-without-losing-user-sessions – tawman 2012-03-21 13:28:01

+0

你可以在你设置表单身份验证的地方显示代码吗? – 2012-03-21 13:34:53

+0

@tawman感谢您的帮助,但我可以在客户端的浏览器上看到cookie,为什么应用程序不能?对不起,跛脚的问题,但我真的必须解决这个问题,不明白什么是错的。 – Petr 2012-03-21 13:40:12

回答

6

你需要设置在web.config中东西的machineKey这样

<machineKey validationKey="4B79DF965DC586D2B267BDECB4580D40EE6811EE171AC65D929BECD8865C09ED8681B92F2177FE9F72B8E822B26914C79C1FF590CCEE65469CBC6FACD7D9F203" decryptionKey="CF39BCCD33BC38D17A704DFEB85AD9C5F265669FCD6AB54C" validation="SHA1" /> 

您可以使用此工具http://aspnetresources.com/tools/machineKey做到这一点,但你必须将其粘贴介绍web.config文件。

每次应用程序池recycels应用程序重新启动,如果它没有在web.config中设置,自动生成一个新的机器键。 FormsAuthentication cookie与该计算机密钥进行散列处理,每当其发生更改时,该Cookie都将变为无效

+0

这看起来像是我正在寻找的解决方案,我会尝试。 – Petr 2012-03-21 13:56:23

+0

MikeSW非常感谢,它非常完美。 – Petr 2012-03-21 15:05:26