6

私は非常に興味深いが、イライラする問題を抱えています。標準の ASP.NET 認証を使用して MVC 4 サイトを実行しています。

Windows 8 で IE 10 を組み合わせた場合にのみ、自分のサイトをトラバースして https URL から http URL に移動すると (両方とも同じサイトにあります)、別の asp.net_sessionid 値が生成されます。私が試した他のすべてのブラウザーと OS の組み合わせでは、これは問題ではないようです。

高低を検索しましたが、さまざまな認証の問題 (通常は IIS7 が IE10 をブラウザーとして認識しないことに関するもの) を経験している人を確かに見つけましたが、この正確な問題を経験したと主張する人は他に見つかりませんでした。さらに懸念されるのは、「すぐに使える」MVC テンプレート プロジェクトを公開したところ、同じ問題が発生したことです。この問題に遭遇したのは私だけではないはずです (そう願っています)。

他の誰かがこれに遭遇しますか?それとも、いくつかの提案がありますか?

ありがとう

アップデート

さて、もう1つ重要な側面があります。これを負荷分散環境で実行しています。アプリを単一のサーバーにプッシュしてテストしても、問題はありません。

4

1 に答える 1

1

負荷分散された環境でこの問題が発生したとおっしゃいましたね。セッションデータを保存するデフォルトの「In Proc」方法を使用していると思います。もしそうなら、私は何が起こっているのか知っていると思います。(議論のために、2つのサーバーを想定しますが、それ以上あっても問題ありません)

ServerA に送信され、セッションが作成されます。これは In Process であるため、ServerB はそれについて何も知りません。最終的に (そして、それがどのように発生するかは、ロード バランサーの設定方法の問題です。スティッキー セッション? Cookie? ラウンド ロビン?) サーバー B に送信されます。そのサーバーは、あなたがすでにセッションを持っていることを知らなかったからです。新しいセッション ID が作成され、新しいセッション 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 に答える