又一个关于表单认证票据过早过期的问题。我需要使用滑动过期,并将其设置为true。我已经阅读了论坛并理解了精度丢失的问题,即只有在超过过期时间一半后才更新票据。
问题: 我的webconfig如下所示:
<authentication mode="Forms">
<forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
</authentication>
<sessionState timeout="20" />
<authorization>
仅当在20分钟间隔内未发出任何请求时,用户才必须注销并重定向到login.aspx。问题是,用户正在发出请求,但仍然被抛到登录页面。这不应该发生。我想到的方法是为每个请求手动重置SqlAuthCookie。
以下是我的代码。它在context.AcquireRequestState上被调用。
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpContext ctx = HttpContext.Current;
ResetAuthCookie(ctx);
}
private void ResetAuthCookie(HttpContext ctx)
{
HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
return;
FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value);
if (ticketOld == null)
return;
if (ticketOld.Expired)
return;
FormsAuthenticationTicket ticketNew = null;
if (FormsAuthentication.SlidingExpiration)
ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld);
if (ticketNew != ticketOld)
StoreNewCookie(ticketNew, authCookie, ctx);
}
private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx)
{
string hash = FormsAuthentication.Encrypt(ticketNew);
if (ticketNew.IsPersistent)
authCookie.Expires = ticketNew.Expiration;
authCookie.Value = hash;
authCookie.HttpOnly = true;
ctx.Response.Cookies.Add(authCookie);
}
我的问题是:
- 每次请求时重置Cookie是错误的还是可接受的解决方案?
- 为什么它仍然不能工作?似乎新的Ticket从未得到更新。
- 除了会话过期之外,用户表单身份验证过期太快的原因可能还有其他原因,我应该进行调查吗?
谢谢, 敬礼,