2013-10-15 71 views
6

我有一个非常有趣,但令人沮丧的问题。我有一个运行标准ASP.NET身份验证的MVC 4网站。IE10和Windows 8和ASP.NET MVC(IIS 7)

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

我已经搜索了高和低,虽然我当然发现人们遇到各种身份验证问题(通常关于IIS7不承认IE10作为浏览器),我还没有发现任何人声称遇到这个确切的问题。更多关注,我发布了一个“开箱即用”的MVC模板项目,它也有同样的问题。我不可能是唯一一个遇到这个问题的人(所以我希望)。

其他人碰到过吗?或者,甚至只是有一些建议?

感谢

UPDATE

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

+1

可能重复HTTP和https](http:// stackoverflow。COM /问题/ 567535 /何灿的i-共享的-ASP净会话间的HTTP和HTTPS) –

+3

我不知道为什么它的工作在其他浏览器,但它不应该是。除非您将会话cookie配置为安全,否则它们在http和https之间始终会有所不同。 –

+0

呀,好点,但我的理解是B/C我是不是我的cookie设置为与饼干“安全=真正的”应该与HTTPS和HTTP持续。这是否是好的做法,这是客户的愿望。 –

回答

1

你提到你在负载平衡的环境中有这个问题,对吧?我假设你正在使用存储会话数据的默认“In Proc”方法。如果是这样的话,那么我想我知道会发生什么。 (为了争辩,我将假设2台服务器,但是如果你有更多的服务器并不重要)

你被发送到ServerA并创建一个会话。因为这是在进程中ServerB不知道它。最终(以及发生的方式是如何设置您的负载均衡器的问题。粘滞会话?Cookie?循环?),您将被发送到ServerB。因为该服务器有不知道你已经有一个会话;会创建一个新的会话ID并给您一个新的会话ID。

那么,为什么它在你的确切的repro步骤下发生?那么,我的直觉是,如果有足够的时间和负载,你会看到它只是从/ page1导航到/ page2。再次 - 这取决于您的负载均衡器是如何设置的,但可能是因为您正在更改触发某些内容的协议,并将您发送到池中的另一台服务器。

如何解决?
要开始,请确保您的machine.config中具有相同的机器密钥。如果你没有访问权限,我认为它会在web.config中工作,但我没有尝试过。

现在,建立另一种存储会话状态的方式。在Sql Server或者MySql或者Postgres或者任何地方。如果你拥有SQL Server,它将是驱动程序构建以来最简单的,但是如果你有另一个数据库,你需要构建或者找到一个能够实现它的库。我参与了一个使用Postgres存储会话状态的项目。

我们使用npgsql作为驾驶员conenct到服务器,并建立了自己的PgsqlSessionProvider:SessionStateStoreProviderBase和挂钩起来其实是很容易的

<sessionState mode="Custom" customProvider="PgsqlSessionProvider"> 
    <providers> 
    <add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" /> 
    </providers> 
</sessionState> 
[我怎么可以共享一个asp.net会话之间的