【问题标题】:Forms Authentication cookie seems to stop working表单身份验证 cookie 似乎停止工作
【发布时间】:2010-12-10 06:15:20
【问题描述】:

我想在我的应用程序上提供功能,让用户检查他们希望无限期保持登录状态(任意设置 cookie 过期时间为从现在起 3 个月)。

我处理这个的代码是

private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse, 
                                                        bool persistCookie)
{            
    var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie);

    if (persistCookie)
        cookie.Expires = DateTime.Now.AddMonths(3);

    return cookie;
}

private void LoginUser(string userNameResponse, bool PersistCookie)
{
    Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie));

    string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse,
                                                                 PersistCookie);

    Response.Redirect(navigateAfterUrl);
}

但是,稍后当我返回该站点时,我需要再次登录。我已验证该 cookie 与我的到期日期一起返回,并且它没有设置为会话 cookie(也通过关闭/重新打开浏览器进行测试,并且 cookie 仍然存在)。我的一个想法是它与 ASP.NET 会话到期时有关。

我的 web.config 中有一个特定的机器密钥设置,所以如果 IIS 重新启动等,相同的 cookie 不应该工作吗?是否有人对可能导致此问题的原因或至少如何进一步追踪此问题有任何建议,因为我想不出其他任何事情要做。

【问题讨论】:

    标签: c# asp.net forms-authentication stay-logged-in


    【解决方案1】:

    当您调用 GetAuthCookie 方法时,会创建一个 FormsAuthenticationTicket,并使用 web.config 中的 Timeout 属性给出的超时。所以一定要正确设置:

    <authentication mode="Forms">
      <forms
        loginUrl="/someloginUrl"
        requireSSL="true"
        protection="All"
        // This is the setting you are looking for! (it's in seconds)
        timeout="120"
        domain="example.com"
        slidingExpiration="false"
        name="cookieName" />
    </authentication>
    

    一旦票证被加密,它就会被用作 cookie 的值。当您将 cookie 的 Expires 属性设置为给定值时,这表示它将在给定的时间段内保留在客户端计算机上。然后在每个请求 ASP.NET 运行时将检查 cookie 的存在,将尝试解密该值并获取票证。接下来它会使用 Timeout 属性检查票证是否仍然有效,因此如果您有一个小的超时,那么无论您的 cookie 是否仍然传输,票证不再有效并且身份验证将失败。

    【讨论】:

    • 那么如果我将超时设置为 3*30*24*60 会带来什么权衡?在关闭浏览器并删除会话 cookie 之前,不选择保持登录状态的用户永远不会被我们的网站闲置?
    • 即使用户关闭浏览器,如果你设置了一个持久cookie(Expires 属性),那么他也不会被注销。但是如果你调用FormsAuthentication.SignOut方法,cookie就会失效。
    • 我指的是选择不保持登录状态的用户,即 cookie 未设置为持久性。
    • 我主要关心的是用户从公共计算机登录到站点,做一些事情然后走开。通常他们会在一段时间不活动后退出,但将票证超时设置为 3 个月会结束,不是吗?
    • 是的,如果您使用持久性 cookie,它将结束。
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多