asp.net-mvc – ASP.NET MVC RememberMe

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC RememberMe前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
搜索很多,我没有得到任何答案,最后我不得不回到你.下面我正在详细解释我的问题.太久了,所以请不要放弃阅读.我用简单的语言解释了我的问题.

我一直在开发一个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角色和成员资格错误的整个概念.我已经说了我想要的东西.我觉得这很简单合理.

我做了什么

>登录表单用用户名,密码和记住我的字段.
>我在web.config中设置:
< authentication mode =“Forms”>
< forms loginUrl =“〜/ Account / logon”timeout =“2880”/>
< /认证>
>在我的控制器动作中,我有这个:

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)中完全相同的话题.用户在他们的评论中抱怨同样的事情,Scott先生没有提供简单的解决方案.

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

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

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

解决方法

当您选择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);

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

注意:我没有测试这个代码.

猜你在找的asp.Net相关文章