6

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

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

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

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

谢谢

更新

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

4

1 回答 1

1

您提到您在负载平衡环境中遇到过这个问题,对吗?我假设您正在使用默认的“In Proc”方法来存储会话数据。如果是这样的话,那么我想我知道会发生什么。(为了争论,我假设有 2 个服务器,但如果你有更多也没关系)

您被发送到 ServerA 并创建了一个会话。因为这是 In Process 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>
于 2013-10-17T16:03:32.663 回答