0

在 MVC 4 中实现 RememberMe 功能时遇到了麻烦。

我从 Visual Studio 2012 创建了一个新的 MVC4 Internet 应用程序。这已经包括checkbox登录页面上的 RememberMe。我假设它还包括所有必要的代码checkbox。但事实并非如此。我还没有向这个 MVC4 应用程序添加一行代码。

我正在使用WebSecurity.LoginpersistCookie:model.RememberMe我的 web.config 说:

<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

然而经过这么多分钟,会话到期并且用户必须再次登录,即使我检查了 RememberMe checkbox。我在之前的一篇文章中被告知,WebSecurity“自动为我处理”所有这些,但它不起作用。可能是我需要在某处添加额外的代码吗?或者我在 web.config 文件中的身份验证语句丢失某物?

我还尝试过在不同的测试应用程序版本中添加了特定的 cookie 语言:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
int timeout = model.RememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days.
var ticket = new FormsAuthenticationTicket(model.UserName, model.RememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(52000); //  timeout 
cookie.HttpOnly = true; // cookie not available in javascript. 
Response.Cookies.Add(cookie);

但这似乎不起作用,当我查看 cookie 值时,它说会话结束时过期。

帮助!这一直让我发疯。


更新: 一直在做一些测试,因为这仍然不起作用。

首先,我把上面所有的代码都注释掉了cookies 还在发生。我很确定这是来自websecurity.Login传递用户名、密码和 persistCookie: 的过程model.RememberMe。所以我得到了两个 cookie ASPXAUTH 和 RequestVerificationToken 被保存。如果我检查了 Rememberme,则 ASPXAUTH 将在 1 年后到期checkbox;否则它会在浏览会话结束时过期。

但是,当我在 40 分钟后回到该站点时,我已经退出了。当我单击登录时,我必须手动登录。这听起来像是一个愚蠢的问题,但我是否需要向登录控制器添加代码来检查 cookie 并自动记录此人?默认情况下似乎没有这种代码。再说一次,我不明白为什么微软会在视图中提供 RememberMe 选项,但不提供使其工作的代码。

4

1 回答 1

0

代码段的第一行可能是罪魁祸首。它发出没有滑动过期的表单 cookie,因为您的 Web 配置中没有它。

然后,您手动发出 cookie,它将两个表单 cookie 发送到客户端。不幸的是,第一个导致用户退出。

注释掉第一行,剩下的代码好像没问题。

于 2013-06-05T15:46:06.383 回答