经过大量搜索后我没有得到任何答案,最后我不得不回复你。下面我详细解释我的问题。这太长了,所以请不要放弃阅读。我用简单的语言解释了我的问题。
我一直在开发一个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角色和成员身份错误的整个概念。我已经说明了我想要的东西。我认为这很简单合理。
我做了什么
在我的控制器操作中,我有这个:
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先生的博客文章所示。
非常感谢您的帮助。 提前谢谢。
答案 0 :(得分:26)
当您选中“记住我”选项时,您要执行的操作与取消选中时的超时时间不同。不幸的是,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);
...您将获得所需内容的基本版本。
注意:我没有测试此代码。
答案 1 :(得分:4)
戴夫,除了你的代码,我还要添加一行以使其工作。我的意思是让它记住至少一年。除了你的代码之外,我还必须为cookie.Expires分配值才能使它工作。如果未设置此行cookie.Expires,则在计算机重新启动后cookie将丢失,这意味着在会话结束时。我在FireFox中注意到了这一点。我查看了cookie的详细信息,发现:如果未设置cookie.Expires,则Firefox中“Expires:”属性的值为“会话结束时”,但如果设置了cookie.Expires则为“Expires”的值:“Firefox中的属性是指cookie.Expires值设置的日期时间。
以下是代码:
int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line
HttpContext.Current.Response.Cookies.Add(cookie);
谢谢你们,这真是一个很好的解决方案。
答案 2 :(得分:4)
关于在共享环境中使用会员身份验证票的快速说明,适用于可能因此问题而来到这里的任何人。我在godaddy有一个mvc网站runnig并且很难记住我。这是解决方案:
<system.web>
<machineKey
validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953"
decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291"
validation="SHA1" decryption="AES"
/>
感谢: http://www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/
答案 3 :(得分:1)
这不是问题,这是一个特点:)
用户的会话尚未过期,即使他们关闭并重新打开浏览器,cookie仍然很好。
Cookie的过期会使用户的会话无效。
答案 4 :(得分:0)
我已经实现了相同的功能,当我测试它在Mozila工作正常但在IE8中不适用于所有电脑,我也更新了设置以接受IE中的cookie但仍然无效。
Internet Explorer 8.x