2009-07-25 18 views
1

私は奇妙なセッションの問題で出会いました。私は特定のユーザーがWebサイトの一部にアクセスする権限を持っているかどうかを判断するために、セッションを使用してユーザー固有の情報を追跡するWebサイトを開発しました。私はVSTS 2008 + .Net 3.5 + C#を使ってASP.Net Webサイトを開発しています。Httpセッションの問題

私の設計では、http://mysite/sitemanagerにアクセスすると、セッションIDがない場合、ユーザーはユーザー名とパスワードの入力を求められます(パスワードが渡された場合は、セッションIDが許可されます)。セッションIDが利用可能な場合は、ユーザーにサイト管理権限があり、認証済みであることを意味します。サイト管理者のすべての機能にアクセス可能である必要があります。

トラブルシナリオは、私が前にログインしていない、と私は私の資格や許可されたサイトの管理権限を使ってログインしますので、私は、新しいIEウィンドウからhttp://mysite/sitemanagerにアクセスし、このように、その後

    1. です私は
    2. は、私がアクセスに同じIEウィンドウにアドレス http://mysite/sitemanagerを貼り付け、 http://mysite/sitemanager、グーグルのapprearsを置き換えるために、同じIEウィンドウのアドレスバーに http://www.google.comを入力します(IEを閉じていない)、私は私がに許可を求めるわけではない驚いています入力パスワード。

    何が間違っていますか?私が欲しいのは、ステップ(3)でユーザーはパスワードを入力するよう求められます。

  • 答えて

    2

    あなたのサイトは単にあなたがサイトから退去したため終了していません。セッションは、サイトとの最後のやりとり以来、タイムアウト期間中はアクティブのままです。そのため、セッション情報がまだ存在します。

    あなたのコメントに答えるには、Session.Abandon()を呼び出してセッションを終了できます。誰かがサイトを離れるときにやりたいのであれば、Session.Abandon()を呼び出すか、少なくとも資格情報をリセットするページのアンロードクライアントイベントでajax呼び出しを行うことをお勧めします。しかし、自分のサイトに別のページのページを残していてもアンロードが呼び出されるので、それは難しいかもしれないので、チェックしなければなりません。そして、はい、それは設計によるものです。特に指定しない限り、デフォルトのセッションタイムアウトは20分です。

    +1

    ありがとうございますSirDemon、1.それはサーバー側で私のコードのバグではなく、設計であることを意味しますか? 2.ステップ(3)でユーザーにユーザー名とパスワードを入力する方法はありますか? – George2

    +0

    ありがとうございますSirDemon、あなたは共有する関連トリッキーなコードがありますか?私はあなたのAjaxコードを試したいと思っています。 :-) – George2

    +0

    別のURL(サンプル内のGoogle)を入力して新しいURLに移動すると、アンロードされたクライアントイベントがトリガーされることを意味しますか? – George2

    2

    セッション状態は、ユーザーがサーバーから与えられたセッションCookieを削除した場合にのみ失われます。または、ユーザーは特定の期間(Session.TimeOutプロパティ)の期間を要求しません。または、コード内でそれを放棄した場合。

    +1

    Thanksçağdaş、1.サーバー側のコードバグではなく、設計上の意味ですか? 2.私はセッションがクッキーに実装されていると思います。つまり、GoogleにアクセスしていてもIEはhttp:// mysite/sitemanagerのセッションクッキーを保持していますか?ドメイン(Google)を変更してもIEは以前のドメイン(mysite)のセッション情報を保持しているので非常に混乱しています3.ユーザーはステップ(3)でユーザー名とパスワードを入力しますか? – George2

    +1

    1.うん、それは設計による。あなたのコードに間違いはありません。 2.それは本当にクッキーですが、ブラウザが閉じられると削除されます。私はあなたがそれをすることができるとは思わない。また、私はそれを実装しようとするべきではないと思います。あなたのユーザーがGoogleで何かを探している間にあなたのサイトを閲覧しているとしたら、それだけであなたのサイトからログアウトしたとします。 –

    +0

    ありがとうございました。私のシナリオはエンドユーザーが共有コンピュータを使用する可能性があります。 2番目のユーザーに1番目のユーザーのアクセス許可を使用させたくありません。 :-) 私の問題のアドバイスは何ですか?いずれかの解決策が秘密にされる可能性があることを感謝します。 – George2

    1

    これはウェブセッションがあらゆるところで機能する方法です。驚くべきユーザを避けるため。おそらくこの動作を受け入れるだけの方がよいでしょう。


    は、しかし、あなたは本当に

    ではなく、それはだから実装に問題となることが予定されてアンロードイベントを(使用して...ここではどのようだ、彼らはあなたのサイトの使用を停止する場合、ユーザーがログオフしたい場合誰かが本当にあなたのサイトを離れているときには分かりません。サイトに2つのウィンドウが開いているとどうなりますか?)、セッションタイムアウトを1分に短縮し、クライアント側のキープアライブを使用することをお勧めします。サーバは、所定のURLで数秒ごとに(例えば10)、セッションを生き残らせること以外は何もしない。

    これは、必要に応じて、iframeを介してメタリフレッシュタグ付きページに完全に実装できます。もちろん、javascriptではもっと堅牢でシンプルになりますが、隠されたiframeはあまり複雑ではなく、メタタグもありません。サーバーサイドのリフレッシュページが304の未変更の送信をサポートしている場合は、オーバーヘッドソリューションも非常に低いでしょう。

    <iframe src="keepalive.aspx" width="1" height="1" /> 
    <!--and perhaps use css to hide the iframe - but test that!--> 
    

    そしてkeepalive.aspxにあなたが含まれたい:最後に

    <meta http-equiv="refresh" content="5" /> 
    

    帯域幅最適化として、中にあなたがいつものようなものが含まれるだろう、あなたのメインのファイルで

    keepalive.aspxのコードでLast-Modifiedレスポンスヘッダーを追加し、ブラウザがIf-Not-Modified-Sinceリクエストヘッダーを送信したかどうかを確認し、もしあればフルドキュメントの代わりに304 Not-Modifiedを送信する。

    最後に、もしあなたがJavaScriptに依存していても(そのようなログインベースのWebアプリケーションの多くは)、単にiframeを必要とせずにお気に入りのAjaxフレームワークを定期的にリクエストすることができます。

    +0

    ありがとうEamon、なぜあなたがあなたのサイトへの2つのウィンドウを開いている場合、アンロードイベントを使用して実装の問題があるでしょう、あなたは私に詳細を教えてくださいできますか? – George2

    +0

    もう1つ興味深い点は、Last-Modifiedレスポンスヘッダーを使用する場合と比較して、ajaxを使用してサーバー側の帯域幅と作業負荷を大幅に減らすことでしょうか? – George2

    +0

    いいえ、304-Not-modifiedとAJAXはどちらもCPUと帯域幅の両方で「ほぼ自由」です。彼らは両方とも低重量のカスタムIHttpHandlersで実装できます。 1つのボックスに100万人のクライアントを簡単に奉仕することは可能でしょう。そうしているのであれば、心配する必要はありません。あなたのボトルネックは他の場所(例えば、セッション中)にあります。 –