13

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

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

我只需要这个:

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

注意:我通过为用户创建自己的 talbes 并针对我的数据库表进行身份验证,在我的其他项目中设置 cookie 和会话,成功地实现了上述功能,而无需使用标准的 asp.net 角色和成员资格。但是对于这个项目,我们从一开始就使用标准的 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 示例。在我的示例中,如果我将超时设置为 5 分钟,那么用户会话将在 5 分钟后过期,没关系。但如果用户关闭浏览器并重新打开浏览器,用户仍然可以在没有登录的情况下进入网站,直到“超时”中指定的时间没有过去。超时值的滑动到期也可以正常工作。现在,如果用户在选中记住我的情况下登录系统,用户会话在 5 分钟后仍会过期。这不是好的行为,是吗?我的意思是说,如果用户登录系统时勾选了记住我,他应该被记住很长时间,直到他没有 t 退出系统或用户未手动从浏览器中删除所有 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 先生的博客文章中可以看出。

您的帮助将不胜感激。提前致谢。

4

5 回答 5

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

...您将获得所需的基本版本。

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

于 2010-03-16T07:58:28.560 回答
4

只是一个关于在共享环境中使用会员身份验证票的快速说明,供可能遇到该问题的任何人使用。我有一个 mvc 站点在 godaddy 运行,但在记住我时遇到了麻烦。这是解决方案:

<system.web>
<machineKey
  validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953"
  decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291"
  validation="SHA1" decryption="AES"
/>

感谢: http ://www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/

于 2010-07-04T19:51:40.760 回答
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);

谢谢你们,这真的是一个很好的解决方案。

于 2010-03-16T11:29:03.633 回答
1

这不是问题,这是一个功能:)

用户的会话还没有过期,所以即使他们关闭并重新打开浏览器,cookie 仍然是好的。

使用户会话无效的是 cookie 的过期时间。

于 2010-03-16T07:45:44.977 回答
0

我已经实现了同样的事情,当我测试它时,它在 Mozila 中运行良好,但在所有电脑的 IE8 中都无法运行,我还更新了设置以在 IE 中接受 cookie,但仍然无法运行。

互联网浏览器 8.x

  1. 单击工具菜单。
  2. 在菜单中选择 Internet 选项 - 将打开一个新窗口。
  3. 单击窗口顶部附近的“隐私”选项卡。
  4. 单击窗口的默认按钮。
  5. 移动滑块,使其位于中高以下的级别之一(包括中、低、接受所有 Cookie)。
  6. 单击确定保存更改。
  7. 您现在应该可以将商品添加到购物车了。
于 2010-06-28T07:33:55.103 回答