【问题标题】:ASP.NET_SessionId cookie behavior explanationASP.NET_SessionId cookie 行为说明
【发布时间】:2017-02-10 03:21:12
【问题描述】:

我有一个MVC ASP.NET 项目并具有以下操作过滤器属性

public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
    HttpContext ctx = HttpContext.Current;

    if (ctx.Session != null)
    {
        if (ctx.Session.IsNewSession)
        {
            string sessionCookie = ctx.Request.Headers["Cookie"];
            if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult { Data = "Session Timeout. Redirecting...", ContentType = "application/json" };
                    filterContext.HttpContext.Response.StatusCode = 440;
                }
                else
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary 
                        {
                            { "Controller", "Error" },
                            { "Action", "SessionTimeout" }
                        });
                }
            }
        }
    }
}

我要做的是重定向到SessionTimeout 操作,该操作会在 IIS 会话超时时显示错误页面。

大多数情况下它运行良好,但我发现有时,尤其是我第一次启动应用程序时,此代码会运行到 else,从而重定向到错误页面这是不需要的,因为这是用户的第一次访问。

(这里的“第一次”表示距离上次运行应用程序有足够长的时间,比如几天)

遇到else 块,这意味着会话是一个新会话,但也存在ASP.NET_SessionId cookie。

我的问题是:为什么会这样?这种行为是否正常且符合预期?

(我不需要解决方案,只需对行为进行一些解释就可以了……)

【问题讨论】:

    标签: c# asp.net asp.net-mvc cookies iis-7


    【解决方案1】:

    Asp.Net Session cookie 通常是 session cookie。也就是说,一旦关闭所有浏览器窗口,它就会被浏览器删除。但是,如果用户让他/她的浏览器保持打开状态并执行其他操作一段时间,足以让Asp.Net Session 在服务器上过期,然后返回您的站点,则浏览器将发送 cookie,服务器将不认识它并开始一个新的会话。在这种情况下,您将看到您描述的问题。

    某些浏览器还具有某种恢复上一个会话功能,这意味着即使浏览器在其间关闭,本应被删除的 cookie 仍将继续存在。

    我没有对此进行测试,但是您可以通过将新的Asp.Net Session 的 ID 与 cookie 中的值进行比较来识别这种情况...

    【讨论】:

    • 谢谢...这对我来说更清楚了。关闭浏览器(为了删除这个会话cookie),是否意味着关闭浏览器的所有选项卡? (我正在使用 Chrome)
    • 是的,不同的浏览器选项卡通常共享同一个客户端会话。甚至不同的浏览器窗口通常也共享同一个客户端会话。
    最近更新 更多