代码之家  ›  专栏  ›  技术社区  ›  Chris Marisic

表单身份验证cookie似乎停止工作

  •  0
  • Chris Marisic  · 技术社区  · 15 年前

    我希望在我的应用程序上有一个功能,允许用户检查他们是否希望无限期地保持记录(从现在起任意设置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不应该工作吗?是否有人对可能导致这种情况的原因有任何建议,或者至少对如何进一步追踪这种情况有任何建议,因为我想不出还有其他事情要做。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Darin Dimitrov    15 年前

    当你打电话给 GetAuthCookie 方法A FormsAuthenticationTicket 创建时超时由 Timeout web.config中的属性。所以一定要正确设置:

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