MVC3 不接受 cookie

Posted

技术标签:

【中文标题】MVC3 不接受 cookie【英文标题】:MVC3 Doesn't accept cookie 【发布时间】:2012-04-06 00:19:56 【问题描述】:

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

感谢您的帮助。

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");

【问题讨论】:

可能由于空闲超时导致的应用程序池重启导致会话 cookie 无效 - 请参阅 ***.com/questions/4277944/… 您能在设置表单身份验证的位置显示代码吗? @tawman 感谢您的帮助,但我可以在客户端的浏览器上看到 cookie,为什么应用程序看不到?对不起,蹩脚的问题,但我真的必须解决这个问题,不明白出了什么问题。 @PetrMares 客户端 cookie 仅与服务器端对其存在的回忆一样有效。一旦应用程序池回收,服务器端会话管理就不会存储客户端 cookie 提供的令牌。您可以使用数据库在服务器端持久化会话 cookie 以解决此问题。 @DavidHoerster:我添加了代码。 【参考方案1】:

你需要在 web.config 中设置 machinekey 像这样

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

您可以使用此http://aspnetresources.com/tools/machineKey 工具来执行此操作,但您必须将其粘贴到 web.config 中。

每次应用程序池回收时,应用程序都会重新启动,如果未在 web.config 中设置,则会自动生成一个新的机器密钥。 FormsAuthentication cookie 使用该机器密钥进行哈希处理,每次更改时,cookie 都会失效

【讨论】:

这似乎是我一直在寻找的解决方案,我会尝试一下。

以上是关于MVC3 不接受 cookie的主要内容,如果未能解决你的问题,请参考以下文章

mvc3 验证输入“不等于”

mvc3中关于Razor视图中的及页面区别,以及在啥情况下用哪个页面,最好能有实例。

MVC3 jquery.validate.unobtrusive 覆盖选项而不编辑源?

自定义格式日期的 MVC3 不显眼日期验证

MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器

.net MVC3 写代码 cshtml 语法不变色显示,全是黑色的,求指教,把VS2010,mvc3重装了也不行