【问题标题】:Renewing forms authentication ticket - strange timing更新表单身份验证票 - 奇怪的时机
【发布时间】:2016-04-22 00:55:14
【问题描述】:

我使用表单身份验证相当成功,但遇到了一个奇怪的问题。我浏览了网络,到目前为止还没有找到答案。

我正在使用一些 Javascript 来确定当前会话何时距离超时还有 60 秒,如果是,则弹出一个带有按钮的对话框,如果按下该按钮,将扩展当前的 FormsAuthentication 票证。

这是我用来更新票证的代码。我只是在票的当前到期日期上增加 5 分钟。但是当我输出新的到期日期时,它总是不到 5 分钟;通常是 4 分几秒。

代码:

    string userID = HttpContext.Current.User.Identity.Name;
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(userID, true);

    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

    DateTime NEW_EXPIRY = DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes);

    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
        ticket.Version, 
        userID, 
        DateTime.Now,
        NEW_EXPIRY,
        ticket.IsPersistent,
        ticket.UserData,
        ticket.CookiePath);

    cookie.Value = FormsAuthentication.Encrypt(newTicket);

    if (ticket.IsPersistent) cookie.Expires = newTicket.Expiration;

    cookie.Secure = FormsAuthentication.RequireSSL;

    HttpContext.Current.Response.Cookies.Add(cookie);

所以,这里是时差的示例输出:

现在的时间戳 = 16/01/2016 14:03:28 ticket expires=16/01/2016 14:07:49 (TOTAL SECONDS=261.0857244)

为什么不将过期时间重置为 14:08:28?我在这里撞墙了……

【问题讨论】:

  • 网站是在本地运行还是在服务器上运行?
  • 我在这里有点冒险-您的代码是否可能需要可变的秒数才能获得FormsAuthentication.Timeout 属性?可能是由于您的 IIS 设置?我的猜测是,在运行时,DateTime.Now 被读取,然后需要一些时间来初始化并获得超时,然后将其添加到现在过期的时间......
  • @stuartd - 它在本地运行,但在服务器上也是如此
  • @balah - 我不确定是否有任何延迟。到期时间戳小于应有的值。当我输出应用于 FormsAuthentication 票证对象的值时,它是正确的。但是,在对其进行加密并将其添加到 Cookie 响应对象后,该值最终会小于应有的值,如上例所示。
  • 是的,无论如何,这是一个远射。您使用的是哪个版本的 .NET?

标签: c# asp.net formsauthentication


【解决方案1】:

好的,所以我仍然不知道为什么 FormsIdentity 对象的过期值不正确......所以我所做的是从更新方法传回实际的新过期值(作为 DateTime),并且依赖在那。所以看起来这个值是正确的,这就是我应该用来确定实际超时值的值。

这有意义吗?我不知道,但它现在正在工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2013-05-17
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多