0

我想在我的应用程序上提供功能,让用户检查他们希望无限期地保持登录状态(任意设置 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 不应该工作吗?是否有人对可能导致此问题的原因或至少有关如何进一步追踪此问题有任何建议,因为我想不出其他任何事情要做。

4

1 回答 1

1

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

<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 是否仍然传输,票证不再有效并且身份验证将失败。

于 2009-10-26T19:52:03.080 回答