【问题标题】:"Remember Me" with asp.net web pages“记住我”与 asp.net 网页
【发布时间】:2013-08-07 14:37:09
【问题描述】:

我意识到这个问题可能以前被问过,但我找不到与我的情况完全匹配的任何内容。

我在 ASP.Net 网页(不是 Web 表单)和 WebMatrix 中使用 WebMail 帮助器创建了一个网站。用户需要登录网站,并且有一个“记住我”框(理论上)将让用户保持登录状态,直到他/她选择退出。如果用户关闭浏览器并在 20-30 分钟内重新打开,该网站会保持用户登录状态。但是,在 20-30 分钟未访问该网站后,用户将退出。 (顺便说一句,即使使用 WebMatrix 模板“Starter Site”,这个问题似乎也存在。)

我尝试了多种解决方案,其中许多已发布在 Stack Overflow 上,但似乎没有任何效果。

【问题讨论】:

  • 您尝试过哪些“多种解决方案”?会有所帮助,所以我们不会重复它们。
  • 很遗憾,我没有保存无效的尝试,因此我无法准确告诉您我尝试了什么。大多数涉及尝试创建我的网站可以访问的 cookie,但我不确定我是否正确创建了 cookie,或者我的访问尝试是否正确。
  • 我希望在该代码模板的某个地方,有一个条件,它检查当前会话不活动的持续时间。查看验证码,看看是否有时间检查或类似的东西。

标签: c# asp.net razor webmatrix


【解决方案1】:

编辑 2

Forms Authentication 使用的 cookie 名为“.ASPXAUTH”,默认设置为 30 分钟后过期。

转到您的web.config 并找到authentication 元素。您可以在此处设置 cookie 过期时间(以分钟为单位),如下所示:

<system.web>
    <authentication mode="Forms">
        <forms loginUrl="~/Account/Login" 
               name="myCookie"                  <!-- optional, if you want to rename it -->
               timeout="2880" />                <!-- expires in 48 hours -->
    </authentication>
</system.web>

如果配置失败,试试这篇文章:Link

您需要清除所有现有的身份验证票并创建您的自定义票。如果用户选择了remember me 选项,则归结为您需要执行的这段代码:

    if (rememberMe)
    {
        // Clear any other tickets that are already in the response
        Response.Cookies.Clear(); 

        // Set the new expiry date - to thirty days from now
        DateTime expiryDate = DateTime.Now.AddDays(30);

        // Create a new forms auth ticket
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, loginModel.UserName,  DateTime.Now, expiryDate, true, String.Empty);

        // Encrypt the ticket
        string encryptedTicket = FormsAuthentication.Encrypt(ticket);

        // Create a new authentication cookie - and set its expiration date
        HttpCookie authenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        authenticationCookie.Expires = ticket.Expiration;

        // Add the cookie to the response.
        Response.Cookies.Add(authenticationCookie);
    }

【讨论】:

  • 没错,但是,有些主机不允许设置超时,甚至通过设置配置它会被覆盖。
  • 再想一想,设置会话超时不是一个好的解决方案。他的 cookie 只是超时,因此正确的解决方案是在用户登录时设置其过期时间。更新答案。
  • 是的。这都是示例代码,但我想你的看起来有点相似。重要的是在身份验证成功后设置 cookie 过期时间。
  • 我说得太早了——一个小时后我就退出了。 :-(
  • @Trickery Curious: 我知道你在哪里设置 cookie [0] 的到期日期,但我看不到这个 cookie 是如何(我什至看不到的名称)由 ASP.NET 检查。也许应该查看会话超时(在比 web.config 文件更多的地方处理)?我的意思是,据我所知,没有存储任何数据来记住这个增加的过期时间(至少不在适当的地方)。我弄错了吗?
【解决方案2】:

您可以手动创建一个 cookie(永不过期),其中包含映射到您的用户的 GUID。当用户对您的用户登录页面进行 GET 操作时,您可以读取该 cookie 并检查 guid 并对用户进行身份验证。检查链接

http://msdn.microsoft.com/en-us/library/ms178194(v=vs.100).aspx

http://msdn.microsoft.com/en-us/library/78c837bd(v=vs.100).aspx

http://www.codeproject.com/Articles/31914/Beginner-s-Guide-To-ASP-NET-Cookies

【讨论】:

  • 所以我理解它的方式是,我仍然需要在每次使用“提醒我”选项登录时在服务器(GUID)上保留一些信息......最终这些需要过期并以某种方式被清除。对吗?
猜你喜欢
  • 2011-01-28
  • 2011-03-22
  • 2017-06-04
  • 2021-11-18
  • 1970-01-01
  • 2010-10-20
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多