4

イタリック体のすべてが元の投稿です。以下の編集はイタリック体ではありません

ASP.NET 4.0 を使用して C# で記述しています。SQLルックアップを介してユーザー資格情報を認証しています。有効な場合は、ユーザー名をセッション変数に保存してから、ユーザーをメインページにリダイレクトしています。ものすごく単純。

if (!db.isValidLogin(userName, passWord))
    {
        //invalid login, show it!
        //just some code to tell the user invalid credentials
    }
    else
    {
        //show login successful!
        //update some items on the screen
        Session["username"] = userName.ToUpper();
        Response.Redirect("/");
    }

現時点では内部開発であるため、これはまだ SSL ではありません。Chrome バージョン「25.0.1364.172 m」を使用すると、適切にリダイレクトされ、「ログイン」されます。私の画面は、ユーザー名を表示し、認証が許可する機能へのアクセスを許可することで、それを表しています。(32 ビット) IE 9 バージョン "9.0.8112.16421" を同じサーバー側コードと手順で使用すると、リダイレクトを実行すると、セッション変数 "username" がなくなります。実際、セッションのアイテム数は 0 です。リダイレクトの前にセッション変数が設定され、それは正しいです。Windows Server 2008 R2 64 ビット ボックスと Windows 7 64 ビット ボックスで同じ結果が得られました。IIS と SQL の両方をホストする単一のサーバーを使用しています。セッションサーバーを使用していません。トレースしてしまった… コードはリダイレクトまで正確に実行されています。資格情報を受け取り、検証するためにストアド プロシージャを実行します...リダイレクトする前にセッション変数を設定します(セッションと変数を確認でき、値は正しいです).そしてリダイレクトします...そして、述べたように、Chromeでは正確に動作します必要に応じて... IEでは、リダイレクト時にセッションが失われます。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることが、ブラウザとサーバー セッションの不一致を引き起こしていると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!資格情報を受け取り、検証するためにストアド プロシージャを実行します...リダイレクトする前にセッション変数を設定します(セッションと変数を確認でき、値は正しいです).そしてリダイレクトします...そして、述べたように、Chromeでは正確に動作します必要に応じて... IEでは、リダイレクト時にセッションが失われます。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることが、ブラウザとサーバー セッションの不一致を引き起こしていると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!資格情報を受け取り、検証するためにストアド プロシージャを実行します...リダイレクトする前にセッション変数を設定します(セッションと変数を確認でき、値は正しいです).そしてリダイレクトします...そして、述べたように、Chromeでは正確に動作します必要に応じて... IEでは、リダイレクト時にセッションが失われます。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることが、ブラウザとサーバー セッションの不一致を引き起こしていると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!リダイレクトする前にセッション変数を設定します(セッションと変数を確認でき、値は正しいです)..そしてリダイレクトします...そして、述べたように、Chromeでは希望どおりに正確に機能します... IEではセッションが失われますリダイレクト。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることが、ブラウザとサーバー セッションの不一致を引き起こしていると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!リダイレクトする前にセッション変数を設定します(セッションと変数を確認でき、値は正しいです)..そしてリダイレクトします...そして、述べたように、Chromeでは希望どおりに正確に機能します... IEではセッションが失われますリダイレクト。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることで、ブラウザとサーバー セッションの間で不一致が発生していると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!述べたように、Chrome では希望どおりに動作します... IE ではリダイレクト時にセッションが失われます。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることで、ブラウザとサーバー セッションの間で不一致が発生していると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!述べたように、Chrome では希望どおりに動作します... IE ではリダイレクト時にセッションが失われます。私もこれを試しましたが成功しませんでした: Response.Redirect("/", false); したがって、クライアントに Cookie を設定することで IE が行っていることで、ブラウザとサーバー セッションの間で不一致が発生していると確信しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!これにより、ブラウザとサーバー セッションの間で不一致が発生しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!これにより、ブラウザとサーバー セッションの間で不一致が発生しています。私はresponse.redirectをやるべきではありませんか??? また、response.redirect を実行した場合、セッションがリセットされないようにするにはどうすればよいですか? 繰り返しますが、Chrome を使用している場合はこのようなことはありません。イライラする...助けてくれてありがとう!

新しい情報

回答ごとにIEキャッシングをオフにしようとした後...セッションIDをブラウザーに出力して、それが何であるかを確認することにしました。

動作は、ログインとリダイレクトよりも直接的です...

IE では、F5 キーを押してブラウザーを更新するだけで、サーバー上に新しいセッションが作成されます。更新するたびに、新しいセッション ID を受け取ります。

これをChromeでテストすると、session.abandonを呼び出してセッションをタイムアウトにするか、ブラウザを閉じて再起動しない限り、新しいセッションIDを取得できません。

ユーザーがログアウトをクリックしたときにのみ session.abandon を呼び出していましたが、誤って放棄しないように (念のため) そのコードをコメントアウトしました。

実際のページ更新の間のどこかで、IE はサーバーに新しいセッションを提示しています... ARGH。

例: Chrome: ログイン前: myjuzrmccerk1t4eakcliq14 ログイン後: myjuzrmccerk1t4eakcliq14

IE: ログイン前: unyebuc2ikac12xnhpssy0em ログイン後: unyebuc2ikac12xnhpssy0em

F5 または Ctrl-R で更新: 1 つ: ptjt42fjwzgdreyyyo3cmvrs 2 つ: s1hd5aatl5yexeuc125aqhst 3 つ: kbpflurcdcxubux3scmdm4k5

更新 2

セッションに「State Server」を使用するようにサイトを変更し、適切なサービスを開始しました。動作に変更はありません。

答え

私の担当者が少ないので.. .これでさらに 3 時間は自分の質問に答えることができません..

私は修正を見つけました...試行錯誤の結果。

「cookieless = true」を追加するまで、セッションステートのInProcとStateServerはどちらも同じ結果でした

<sessionState mode="StateServer" cookieless="true" />

これにより、Chrome と IE (問題があった場所) の両方でセッション状態が一貫し、ページの更新間でセッション ID が変更されなくなりました。なぜこれが起こるのかを判断できませんでしたが、それでも修正されました.. マイクとアンチサイエンスに感謝します!

4

5 に答える 5

4

「cookieless = true」を追加するまで、セッションステートのInProcとStateServerはどちらも同じ結果でした

これにより、Chrome と IE (問題があった場所) の両方でセッション状態が一貫し、ページの更新間でセッション ID が変更されなくなりました。なぜこれが起こるのかを判断できませんでしたが、それでも修正されました.. マイクとアンチサイエンスに感謝します!

于 2013-03-25T13:28:25.350 に答える
2

IE のキャッシング メカニズム (これは良くないと広く見なされています) がここで問題になる可能性があることを示すレポートがにもいくつかあります。 ページに以下を追加してみてください:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

...そして、それが何らかの効果があるかどうかを確認しますか? 他の選択肢は、あなたができることです:

int randomNumber = new Random().Next(1, 1000);
Response.Redirect("/?nocache=" + randomNumber);

...テスト用です。ええと、日付を数値として叩いてテストすることもできます。

于 2013-03-24T20:57:02.480 に答える
0

IFrame 内でホストされている Web ページでも同じ問題が発生しました。トラブルシューティングでは、ASP.NET セッション Cookie が途中で失われ、Internet Explorer を使用している場合にのみ発生したことが示されました。IE の別のタブで Web ページを開くと、すべて正常に機能しました。

この問題は、Internet Explorer のセキュリティが原因で発生しました。P3P HTTP ヘッダーがない限り、Cookie は保持されません。ブロックされた URL を確認するには、[IE] -> [表示] -> [Web ページのプライバシー レポート] に移動し、[制限された Web サイト] を表示することを選択します。

すべてのリクエストにダミーの P3P ヘッダーを追加することで問題を解決しました。ヘッダーは次のようになります。

P3P:"Bogus P3P header because Internet Explorer requires one"

これは、facebook.com が使用するのと同じアプローチです。p3p ヘッダーは次のようになります。

p3p:CP="Facebook does not have a P3P policy. Learn why here: http://(...)/p3p"

Cookie がブロックされている/Internet Explorer の IFRAME に保存されていないも参照してください。

于 2016-05-04T09:38:18.437 に答える