【发布时间】: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