ASP.NET MVC RememberMe

ncc*_*071 13 asp.net-mvc remember-me

搜索了很多后我没有得到任何答案,最后我不得不回复你.下面我详细解释我的问题.这太长了,所以请不要放弃阅读.我用简单的语言解释了我的问题.

我一直在开发一个asp.net mvc项目.我正在使用标准的ASP.NET角色和成员资格.一切都很好,但记住我的功能根本不起作用.我列出了所有工作细节.希望你们能帮助我解决这个问题.

我只需要这个:

我需要用户登录Web应用程序.在登录期间,他们可以记住我或没有它登录.如果用户登录时记得我,我希望浏览器长时间记住它们,让我们说至少一年或相当长的时间.他们在www.dotnetspider.com,www.codeproject.com,www.daniweb.com和许多其他网站上的方式.如果用户登录时不记得我,那么浏览器应允许访问网站大约20-30分钟,之后他们的会话将过期.当用户登录并关闭浏览器而不注销时,他们的会话也应该到期.

注意:我已经成功实现了上述功能,而不使用标准的asp.net角色和成员资格,为用户创建自己的talbes并对我的数据库表进行身份验证,在我的其他项目中设置cookie和会话.但对于这个项目,我们从一开始就使用标准的asp.net角色和成员资格.我们认为它会起作用,在测试之后所有内容都构建完毕后它才起作用.现在我们不能用我自己的自定义用户表和所有东西替换标准asp.net角色和成员资格的现有功能,你明白我在说什么.

有标准的asp.net角色和成员资格功能存在某种错误,或者我有标准asp.net角色和成员身份错误的整个概念.我已经说明了我想要的东西.我认为这很简单合理.

我做了什么

  1. 使用用户名,密码登录表单并记住我的字段.
  2. 我在web.config中的设置:

    <authentication mode ="Forms">
    <forms loginUrl ="〜/ Account/LogOn"timeout ="2880"/>
    </ authentication>

  3. 在我的控制器动作中,我有这个:

    FormsAuth.SignIn(userName,rememberMe);

    public void SignIn(string userName,bool createPersistentCookie){FormsAuthentication.SetAuthCookie(userName,createPersistentCookie); }

现在问题如下:

我已经在上面的章节中说过"我只需要这个".用户可以成功登录系统.它们的会话存在的时间与web.config中超时值中指定的分钟数相同.我还给了我的web.config示例.在我的samplem中如果我将超时设置为5分钟,则用户会话在5分钟后到期,这没关系.但是如果用户关闭浏览器并重新打开浏览器,用户仍然可以在没有登录的情况下进入网站,直到"超时"中指定的时间还没有消失.超时值的滑动到期也正常.现在,如果用户在记住我的情况下登录系统,则用户会话在5分钟后仍会过期.这不是好行为,是吗?我的意思是说,如果用户登录系统并记住我检查了他应该记住很长时间,直到他没有退出系统,或者用户不会手动删除浏览器中的所有cookie.如果用户登录系统而不记得我检查过他的会话应该在web.config中指定的超时时间段之后到期,以及用户是否关闭浏览器.问题是如果用户关闭浏览器并重新打开它,他仍然可以在不登录的情况下进入网站.

我在这个主题上搜索了很多网,但我无法得到解决方案.在Scott Gu撰写的关于完全相同主题的博客文章(http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx)中.用户在评论中抱怨同样的事情,斯科特先生没有给出简单的解决方案.

我在以下地方阅读:http : //weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14/91191. ASPX

我想这是很多用户的问题.正如Scott Gu先生所做的博客文章所示.

非常感谢您的帮助.提前致谢.

Dav*_*nde 26

您想要做的是在选中RememberMe选项时,与取消选中时相比,具有不同的超时.不幸的是,SetAuthCookie方法不允许您手动设置过期,因此您必须自己设置.

那么问题是,怎么做?

ASP.NET MVC使用System.Web.Security的FormsAuthentication类来执行此操作,因为如果您还想支持配置设置和无Cookie浏览以及SSL,这并非易事,但我认为如果您只是这样做:

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days.
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line
cookie.HttpOnly = true; // cookie not available in javascript.
Response.Cookies.Add(cookie);
Run Code Online (Sandbox Code Playgroud)

...你会得到你需要的基本版本.

注意:我没有测试此代码.