为啥 ASP.NET MVC 中的 SessionID 不断变化?

Posted

技术标签:

【中文标题】为啥 ASP.NET MVC 中的 SessionID 不断变化?【英文标题】:SessionID keeps changing in ASP.NET MVC why?为什么 ASP.NET MVC 中的 SessionID 不断变化? 【发布时间】:2010-09-21 20:46:41 【问题描述】:

我正在尝试跟踪某些内容并使用 SessionID 作为该对象的关键

但是每 2-3 次请求更改的 SessionID 不应该保持不变吗?

HttpContext.Session.SessionID

是我正在使用的代码。

【问题讨论】:

【参考方案1】:

我已经看到即使没有 MVC 也会发生这种情况。如果我没记错的话,ASP.NET 会一直分配新的会话 ID,直到您将某些内容放入 Session 变量中。

【讨论】:

即使你把东西放进去,它也会失去会话。 web.config 中的机器密钥是唯一解决该问题的方法 仅当涉及网络场时。如果您在其中一个答案中阅读了 OP 的评论,您会发现向会话变量添加项目确实解决了问题。 我的托管服务提供商没有网络场,向会话中添加内容并不能解决问题。几分钟后我仍然会丢失它 - 即使我在会话中有很多东西(登录用户,他的购物篮,......)我尝试了 2 个托管服务提供商 这是一个相当奇怪的行为,但确实如此,将任何数据分配给 Session 集合可以解决这个问题。 更多信息请见***.com/questions/2874078/asp-net-session-sessionid-changes-between-requests。【参考方案2】:

您应该在 Global.asax.cs 中初始化 Session 对象。

void Session_Start(object sender, EventArgs e)

    HttpContext.Current.Session.Add("__MyAppSession", string.Empty);

除非您的浏览器窗口关闭,否则会话不会改变。

【讨论】:

【参考方案3】:

我正在开发一个 .NET MVC 购物车应用程序并添加了

Session["myVar"] = "1234";

到 Default.aspx.cs 代码中的 Page_Load 方法。我也加了

<%=  this.Session.SessionID %>

到 Site.Master 页脚。然后我重新构建了我的应用程序并浏览了我的应用程序的各个页面,页脚按预期显示所有页面的相同会话 ID!

【讨论】:

【参考方案4】:

如果您查看,除非在服务器上使用,否则会话 ID cookie 甚至不会发送到浏览器。

所以当页面往返时没有当前会话 ID cookie,因此会创建一个新的会话 ID,因此它是随机的。

这是合乎逻辑的,如果会话未在使用中,为什么还要将应用程序绑定到会话?

【讨论】:

【参考方案5】:

我会考虑使用 TempData 来跟踪某些内容。

【讨论】:

实际上我所要做的就是为会话变量分配一个值,然后让它坚持下去..【参考方案6】:

尝试将机器密钥添加到您的 web.config 中: 在线密钥生成器:http://aspnetresources.com/tools/keycreator.aspx 似乎服务器每隔几分钟就会为客户端重置机器密钥并生成具有新会话 ID 的新密钥,这比它应该的要低得多。不知道这是错误还是功能:) 此外,您可以增加会话状态超时,我认为默认为 20 分钟。

【讨论】:

【参考方案7】:

我在使用 ASP.NET Web 窗体时遇到了同样的问题。我只需要在解决方案中添加一个global.asax 文件并为我修复它。

【讨论】:

【参考方案8】:

总结以上@jrojo 和@Maxam 的答案,以及我正在使用的内容。

我使用 AWS DynamoDB 作为会话存储(超出了问题的范围,但提供了示例)。

通过 NUGET 添加包: 安装包 AWS.SessionProvider

更新 Web.config 以在 appSettings 中有键:

<add key="AWSAccessKey" value="XXX" />
<add key="AWSSecretKey" value="YYY" />

和 system.web 的会话提供者:

<sessionState timeout="20"
              mode="Custom"
              customProvider="DynamoDBSessionStoreProvider">
  <providers>
    <add name="DynamoDBSessionStoreProvider"
      type="Amazon.SessionProvider.DynamoDBSessionStateStore, AWS.SessionProvider"
      AWSProfilesLocation=".aws/credentials"
      Table="ASP.NET_SessionState"
      Region="us-east-1"
      />
  </providers>
</sessionState>

在会话开始时向 global.asax 中的会话添加任何内容:

void Session_Start(object sender, EventArgs e) 
  HttpContext.Current.Session.Add("somethingToForceSessionIdToStick", string.Empty);

通过将此添加到任何页面的剃须刀进行验证。刷新该页面,然后打开一个 ignito 窗口并查看不同的会话:

@HttpContext.Current.Session.SessionID

BobsYourUncle

【讨论】:

【参考方案9】:

请查看您是否已将 cookie 的 samesite 属性设置为严格。

删除 cookieSameSite="Strict" 并检查。

【讨论】:

以上是关于为啥 ASP.NET MVC 中的 SessionID 不断变化?的主要内容,如果未能解决你的问题,请参考以下文章

在ASP.NET MVC3中 重写Controller 控制器的构造函数中 其中读取Session时为啥Session为空?

为啥 ASP.NET MVC 中的超时时间很短?

[转]Asp.net MVC使用Filter解除Session, Cookie等依赖

为啥我的 ASP.NET MVC 站点中的此 AJAX 请求会触发预检检查?

为啥在 asp.net mvc 中的公共路由之前先映射特殊路由?

为啥 ASP.NET MVC 中的本地 URL 的 Url.IsLocalUrl 为 false?