表单身份验证票证过早出现的另一个问题。 我需要使用滑动Expiration设置为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);
}
我的问题是:
谢谢你, 的问候,
答案 0 :(得分:14)
表单身份验证Cookie仅在其过期时间过半后自行续订。
来自Microsoft:
如果在到期时间的一半之前访问网页, 票证到期时间不会被重置。例如,如果有任何Web 页面将在下午5:04 00:00:00再次访问,cookie和票证 超时时间不会被重置。
防止性能受损,并避免多个浏览器 对于已启用cookie警告的用户的警告,cookie为 超过指定时间的一半时更新。
这可能是你的问题。如果您的客户在9分钟内访问您的网站,并且再次访问该网站10分钟,他们就会超时。即使您将会话超时设置为20分钟,也会发生这种情况。
像您一样手动更新机票并不是必要的。您只需要启用滑动过期。如果具体时间的一半&#39;规则不适合你,那么你必须看看其他解决方案。