1

首先,这不是 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(非核心)

4

1 回答 1

0

基本问题在于 Microsoft .net Core cookie Managemnt,它不能正确处理 cookie 的生命周期。

我曾多次遇到这个问题,现在主要是使用 .Net 核心。

为了解决这个问题,我们需要重写他们的cookie管理类,并实现ITicketStore接口。

https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationOptions.cs#L136

下面的文章可以帮助您详细实现。

https://mikerussellnz.github.io/.NET-Core-Auth-Ticket-Redis/

我希望它有帮助。

于 2019-03-04T01:59:36.743 回答