FormsAuthentication.SignOut()不会使FormsAuthenticationTicket

时间:2017-11-02 15:43:36

标签: asp.net session cookies forms-authentication formsauthenticationticket

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

1 个答案:

答案 0 :(得分: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/

希望对您有帮助。