【问题标题】:FormsAuthentication.SignOut() does not expire the FormsAuthenticationTicketFormsAuthentication.SignOut() 不会使 FormsAuthenticationTicket 过期
【发布时间】:2018-04-15 05:08:19
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    基本问题是 Microsoft .net Core cookie 管理,它没有正确处理 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/

    希望对你有帮助。

    【讨论】:

    • 我的问题与 .NET 桌面相关,而不是 Core,即使问题是在每个人之间共享的。为了解决这个问题,我最终实现了一个令牌黑名单。
    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多