IE10和Windows 8以及ASP.NET MVC(IIS 7)

6
我遇到了一个非常有趣但令人沮丧的问题。我有一个运行着标准ASP.NET身份验证的MVC 4网站。只有在使用IE 10和Windows 8的组合时,当我从一个https URL导航到http URL(都在同一个站点上)时,它会生成不同的asp.net_sessionid值。在我尝试过的每种其他浏览器/操作系统组合中,这似乎不是一个问题。
我已经四处搜寻过,虽然我确实找到了一些人遇到了各种身份验证问题(通常涉及IIS7无法识别IE10作为浏览器),但我没有找到其他人声称遇到了这个确切的问题。更令人担忧的是,我发布了一个“开箱即用”的MVC模板项目,它也有同样的问题。我不可能是唯一遇到这个问题的人(所以我希望)。
还有其他人遇到这个问题吗?或者甚至有一些建议吗?
谢谢。
更新:
好的,还有一个重要方面。我正在一个负载均衡环境中运行这个网站。如果我将应用程序推送到单个服务器并进行测试,则没有任何问题。

1
可能是重复的问题:如何在HTTP和HTTPS之间共享ASP.NET会话 - Erik Funkenbusch
3
我不知道为什么它能在其他浏览器中工作,但实际上是不应该的。除非你将会话cookie配置为安全模式,否则它们始终会在HTTP和HTTPS之间产生差异。 - Erik Funkenbusch
是的,说得好,但我的理解是因为我没有将我的 cookie 设置为 'secure=true',所以 cookie 应该在 https 和 http 之间持久存在。无论这是否是一个好的做法,这都是客户的愿望。 - Nick Weber
1
负载均衡环境 - 您在哪里存储会话状态,例如StateServer、SQLServer? - Win
“正在处理中”,但这不是与浏览器无关的问题吗? - Nick Weber
1个回答

1
你提到你在负载均衡环境中遇到了这个问题,是吗?我假设你正在使用默认的"In Proc"方法存储会话数据。如果是这样的话,我想我知道可能发生了什么。(为了举例,我将假设有2个服务器,但如果你有更多的话,这并不重要)
你被发送到ServerA,创建了一个会话。因为这是进程内的方式,所以ServerB不知道它。最终(如何发生取决于负载均衡器的设置。粘性会话?Cookies?轮询?),你将被发送到ServerB。因为那台服务器根本不知道你已经有一个会话;所以会创建一个新的会话,并给你一个新的会话ID。
那么为什么会在你的确切复制步骤下发生呢?我的直觉是,如果时间和负载足够长,你只需从/page1导航到/page2就会看到它发生。再次强调 - 这取决于负载均衡器的设置,但可能是因为你在改变协议,触发了某些东西,你被发送到池中的另一台服务器。

如何解决这个问题?
首先,请确保在他们的machine.config中具有相同的机器密钥。如果您无权访问,我认为它将在web.config中起作用,但我没有尝试过。

现在,设置另一种存储会话状态的方式。可以是Sql Server、MySql、Postgres或其他地方。如果您拥有SQL Server,则最简单的方式是使用内置驱动程序,但如果您有其他数据存储,则需要构建或查找一个库来完成。我曾参与过一个项目,我们使用Postgres来存储会话状态。

我们使用npgsql作为连接到服务器的驱动程序,并构建了自己的PgsqlSessionProvider:SessionStateStoreProviderBase,连接它实际上非常容易。

<sessionState mode="Custom" customProvider="PgsqlSessionProvider">
  <providers>
    <add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" />
  </providers>
</sessionState>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接