首先,这不是 ASP.NET 会话未到期的问题,我们在注销时清除、放弃和删除每个 cookie。
这是关于 FormsAuthentication.SignOut() 在调用时不会使票证过期,并允许复制 cookie 内容的人在其他地方手动创建 cookie,并且仍然能够访问现在应该在注销后被阻止的所有内容。
以下是我们注销方法的要点:
HttpContext.Current.User = null;
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Session.Clear();
HttpContext.Current.Session.Abandon();
HttpContext.Current.Session.RemoveAll();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
我们还让 ASP 管理票证的创建和通过我们的 Web.config 和其他任何管理 FormsAuthentication 的身份验证。这是配置中的内容:
<authentication mode="Forms">
<forms name="COOKIENAME" loginUrl="~/PAGE_THAT_REDIRECTS_TO_LOGIN.aspx" defaultUrl="~/PAGE_THAT_REDIRECTS_TO_LOGIN_OR_PROPER_PAGE_IF_LOGGED_IN.aspx" cookieless="UseCookies" timeout="60" />
</authentication>
现在,为什么这是一个问题?很简单,这是一个安全问题,就像有人获取 cookie 并使其保持活动状态一样,他们可以访问匹配 cookie 的用户可以访问的任何内容,即使用户已断开连接。
是否有强制 FormsAuthenticationTicket 过期的正确方法?我尝试解密它,但一切都是只读的,我还尝试创建一个新的过期票并对其进行加密,但它不会覆盖旧票。
谢谢
版本:.NET 4.5.1、ASP.NET(非核心)