asp.net - 如果我的 Asp.Net session IsNewSession == true 意味着什么,我应该关心吗?

标签 asp.net session

首先,这是我继承的代码,编写它的人已不在这里,也无法接受质疑。

我的生产环境中的用户因随机注销我们的 Asp.Net MVC 应用程序而感到恼火(根据引用资料,我们的 MVC 库是版本 5)。在代码和网站中徘徊了一段时间后,我想我已经将用户所看到的内容与以下代码隔离开来:

public class SessionExpireFilterAttribute : ActionFilterAttribute
{

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

        // check if session is supported
        if (ctx.Session != null)
        {

            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {

                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    SessionVariables.Current.User = null;
                    FormsAuthentication.SignOut();

                    filterContext.Result = new RedirectResult("~/Account/Logon");

                    return;
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}

我不完全确定为什么需要此代码(为什么您要将此归因于而不是将其设为全局),但我在互联网上的搜索中看到了此代码的变体,但没有说明您想要的原因它。

无论如何,它已经在我们的代码库中,我们遇到的问题似乎是,如果用户在窗口中闲置一小段时间然后他们执行某些操作,ctx.Session不为空,而是 ctx.Session.IsNewSession是真的。

这对我来说意味着,由于某种原因,Asp.net 决定该用户需要为他们启动一个全新的 session ,并且由于我们不知道该用户是谁(因为他们的所有 session 数据都消失了......一个新的 session )我们需要将他们注销并让他们再次登录。

这一切看起来都很合乎逻辑,除了我终于能够在 IsNewSession 内遇到断点。 if 语句。对我来说奇怪的是,我的 session 实际上看起来 100% 已填写(并且填写正确)。这意味着它正确地知道我是谁,以及只有在您成功登录后才会放入 session 中的所有其他信息。

此外,ctx.User.Identity.IsAuthenticated是真的,并且它有正确的登录名。

一切似乎都表明我有一个有效的 session ,但由于此代码正在做出设计决策,如果 Asp.Net 创建一个新 session ,我必须注销,因此用户将被注销。

所以我的问题是:

  1. Session.IsNewSession 是什么意思?实际意义是什么?
  2. IsNewSession 时始终注销用户是否正确是真的?
  3. 只要用户被列为经过身份验证且具有有效的 session 数据,不注销用户是否会产生任何后果?
  4. 是什么导致 Asp.Net 创建新 session 但仍重复使用以前的 session 数据?
  5. 我对 session 过期的理解是它是由提供者层引起的,因为如果 session 过期,Asp.Net 甚至不会有任何 session 数据。不是这样吗?

顺便说一下,我们目前使用 Redis 作为我们的 session 存储。另外,如果相关的话,应用程序托管在 Azure 网站上(我不确定这如何影响 session 过期)。

最佳答案

每当没有当前 session 的浏览器导航到站点时,ASP.NET 都会创建一个新 session 。因此,即使有人没有登录,他们仍然会有一个 session 。同样,如果一个 session 过期,浏览器下次发出请求时将创建一个新 session 。这个新 session 不会存储“ session 数据”,但 ctx.Session 不会为 null。另外,如果您有多个服务器,并且负载均衡器恰好将用户路由到不同的服务器,那么该新服务器将尝试启动新 session 。

session 状态与身份验证状态分开跟踪,这意味着一个状态可能会过期,而另一个状态仍然有效。对于编写良好的应用程序,这通常不会导致任何问题。然而,某些应用程序在登录时将信息预加载到 session 中,并在 session 期间将 session 视为该信息的一种缓存。或者,当用户执行某些操作时,它们将在 session 中设置值,而稍后的操作将期望这些值位于 session 中,因为用户应该已导航到这些较早的操作才能到达那里。 (例如,向导界面,其中每个步骤都将值保存到 session 中,以便在用户单击最后一步的“完成”时使用。)

有可能您的应用程序在某个时刻期望数据存在于 session 中,但实际上并不存在,而开发人员意识到数据不存在,因为 ASP.NET 已自动更新 session ,从而丢失了所有先前设置的数据 session 数据。他们没有重新设计 session 数据的使用,而是选择这样做,以便每当丢失 session 时,他们也会迫使用户返回到正常的起始位置,在该位置中,页面不会仅仅因为 session 而以奇怪的方式中断-存储的数据丢失。

关于asp.net - 如果我的 Asp.Net session IsNewSession == true 意味着什么,我应该关心吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32488523/

相关文章:

asp.net - 使用其他 CSS 类时禁用 ASP.NET 4.0 中的链接按钮

javascript - html中如何获取session?

asp.net - 无 Cookie session 有多重要? Web 应用程序框架是否应该为它们提供支持?

node.js - NodeJS : What's the best way to share session between server-rendered views and React app

session - 无法登录 Magento 管理员

c# - 使用 ASP.NET Core 反序列化 appsettings.json

jquery - SignalR 和 ASP.net

c# - 将变量传递给 JS 文件

c# - 重定向到页面和按下后退按钮后进入同一页面之间的区别?

ASP.NET:page.Session 和 HttpContext.Current.Session 之间的区别