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

C# IE10和Windows 8以及ASP.NET MVC(IIS 7),c#,asp.net-mvc,iis,load-balancing,C#,Asp.net Mvc,Iis,Load Balancing,我有一个非常有趣但令人沮丧的问题。我有一个使用标准ASP.NET身份验证运行的MVC4站点 仅在Windows 8上的IE 10组合中,当我遍历我的站点并从https url(两者都在同一站点上)导航到http url时,它会生成不同的asp.net_sessionid值。在我尝试过的所有其他浏览器/操作系统组合中,这似乎都不是问题 我到处搜索,虽然我确实发现有人遇到各种身份验证问题(通常是关于IIS7不将IE10识别为浏览器),但我没有发现任何其他人声称遇到过这个问题。更重要的是,我发布了一个

我有一个非常有趣但令人沮丧的问题。我有一个使用标准ASP.NET身份验证运行的MVC4站点

仅在Windows 8上的IE 10组合中,当我遍历我的站点并从https url(两者都在同一站点上)导航到http url时,它会生成不同的asp.net_sessionid值。在我尝试过的所有其他浏览器/操作系统组合中,这似乎都不是问题

我到处搜索,虽然我确实发现有人遇到各种身份验证问题(通常是关于IIS7不将IE10识别为浏览器),但我没有发现任何其他人声称遇到过这个问题。更重要的是,我发布了一个“开箱即用”的MVC模板项目,它也有同样的问题。我不可能是唯一遇到这个问题的人(我希望如此)

还有人碰到这个吗?或者甚至只是有一些建议

谢谢

更新


好的,还有一个更重要的方面。我在负载平衡的环境中运行这个。如果我将应用程序推送到一台服务器并进行测试,我不会有任何问题。

您提到您在负载平衡环境中遇到过这个问题,对吗?我假设您使用的是存储会话数据的默认“In-Proc”方法。如果是这样的话,我想我知道会发生什么。(为了便于论证,我假设有两台服务器,但如果有更多服务器,这并不重要)

您将被发送到ServerA并创建会话。因为这正在进行中,ServerB对此一无所知。最终(如何实现这一点取决于如何设置负载平衡器。粘性会话?Cookies?循环?)您将被发送到ServerB。因为服务器不知道你已经有了一个会话;将创建一个新会话,并为您提供一个新会话ID

那么,为什么它会发生在你精确的复制步骤下呢?好吧,我的直觉是,如果有足够的时间和负载,你会看到它只是从/page1导航到/page2。同样,这取决于负载平衡器的设置方式,但也可能是因为您正在更改触发某些内容的协议,并且您被发送到池中的另一台服务器

如何修复它?
首先,确保在machine.config中有相同的机器密钥。如果您没有访问权限,我想它可以在web.config中运行,但我还没有尝试过

现在,设置另一种存储会话状态的方法。在Sql Server或MySql或Postgres或其他任何地方。如果您有SQL Server,这将是自驱动程序构建以来最简单的,但是如果您有另一个数据存储,则需要构建或找到一个库来实现它。我在一个项目中工作,我们使用Postgres存储会话状态

我们将其用作连接到服务器的驱动程序,并构建了自己的
PgsqlSessionProvider:SessionStateStoreProviderBase
,将其连接起来实际上非常简单

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


我不知道它为什么会在其他浏览器中工作,但它不应该是。除非您将会话cookie配置为安全的,否则http和https之间的cookie将始终不同。是的,这是好的观点,但我的理解是b/c我没有将cookie设置为“secure=true”,cookie应该在https和http之间保持。无论这是否是一个好的实践,这都是client.load balanced环境的愿望—您在哪里存储会话状态—例如StateServer、SQLServer?“正在处理”,但这不是一个独立于浏览器的问题吗?