2009-03-18 14 views
4

私たちは、ユーザーが当サイトを離れてすぐに.Netセッションを終了したことを検出するようなシナリオを持っています。フォーム認証を使用しています。私たちは既に持っているセッションのタイムアウトについて話しているわけではありません。私たちは、ユーザーがいつリンクを介して、アドレスを入力するか、またはブックマークにしたがって、私たちのサイトからブラウズしたかを知りたいと思います。彼らが私たちのサイトに戻ってきたとしても、すぐにログインする必要があります(私はこれが使い勝手の良さではないことを理解しています - これは私たちがクライアントから与えたセキュリティ要件です)。ユーザーがサイトを離れるときにASP.Netセッションの有効期限を強制的に延期するにはどうすればよいですか?

私の最初の本能は、これが不可能であること、または解決策が非常に信頼できないことです。私たちが思いついた唯一の解決策は次のとおりです。

  • ユーザーがサイトを離れるときにセッションをログアウトするようにサーバーに指示するonBlurイベントハンドラを追加します。
  • ユーザーがログインしたら、HTTPリファラーをチェックして、ユーザーがサイト内をナビゲートしていることを確認します。
  • AJAXポーリングをサーバーに追加して、セッションを10秒間隔でリフレッシュする可能性があります。コールが時間通りに受信されないと、セッションは終了します。

onBlurは、最も簡単な、しかしおそらく最も信頼性の低い方法のようです - 私はそれが動作するかどうかは分かりません。また、ユーザーがサイト内のアドレスを入力し、リンクをたどることができないため、リファラーメソッドにも問題があります。 AJAXメソッドはうまくいくと思われますが、複雑です。バックエンドでどのように処理するかはわかりません。私はそれがいつもうまくいかないシナリオもあるかもしれないと思っています。

すべてのアイデアをいただければ幸いです。ありがとう。

答えて

2

..だけ前方にあなたが、そうでなければ、などをフィッシングに使用されている「ユニバーサルフォワーディング」でセキュリティ問題を開くことができますするつもりのサイトにするように注意してください上記。 AjaxポーリングまたはIFRAME。ユーザーがブラウザを閉じて特定のタイムアウトが経過すると(10秒?)、それらをログアウトすることができます。

また、AJAXでサイト全体を実行することもできます。したがって、ユーザが訪問することができ、すべてのコンテンツが動的にロードされる「URL」は1つだけです。もちろん、あらゆる種類のユーザビリティをこのように壊しますが、少なくともあなたの目標は達成されます。

+0

ASP.Netアプリでこれを行いましたか?ポーリングがコールされていないときのバックエンドでの認識はどうですか?言い換えれば、定義によって要求が行われない場合、どのようにこれに対してリスナーを設定しますか? – Raelshark

+1

セッションIDを最後に受信したポーリング時間にマップしたオブジェクトがありました。ページ要求が行われたときはいつでも最後の最後のポーリング時間を取得しました。あまりにも古いかエントリがない場合は、我々はそれらを締結した。私たちは定期的に(数分ごとに)辞書の古いエントリをクリアしました。 – Keltex

0

ユーザーがブラウザを閉じるか、別のURLに入力すると(お気に入りを選択するなど)、検出することはあまりありません。

サイトのリンクの場合は、http://example.com/fooにリンクするのではなく、http://mysite.com/forwarder?dest=http://example.com/fooにリンクするのではなく、サイトから転送するリンクを作成することができます。

ちょうどあなたが記述のように、私は、ハートビートタイプのシナリオのために行っている

0

これは不可能であることをクライアントに伝えることが絶対に必要です。彼らはWebがどのように機能するかについて基本的な誤解を抱いています。外交的である、明らかに...地獄、それはおそらく他人の仕事です...しかし、それは完了する必要があります。

あなたの提案、またはそれらの組み合わせは、単純な概念実証で働くかもしれません...しかし、あなたは悪夢をサポートするだけで、一貫して十分に動作しません。さらに悪いことに、間違ってセキュリティハッキングが発生するため、ユーザーがアプリケーションを使用できない状況も間違いなく発生します。

+1

残念ながら、これをクライアントに指示することは必ずしも可能ではありません。私たちは、政府契約に応募している顧客を持っていました。これは契約上の要件でした。現職の競技者は、それを行うことができると既に主張している(決して確認していない)。だから私たちは本当に何かを試して実行するしかなかった。 – Keltex

+0

まあ、明らかに、クライアントは現職者に満足していなかった、またはあなたは仕事を持っていないだろう。 :) – Bryan

0

JavascriptにはonUnloadイベントがあります。このイベントは、ブラウザからページを離れるよう指示されたときにトリガされます。戻るボタンを押すか、答えを編集中にリンクをクリックしようとすると、StackOverflowでこれを見ることができます。

このイベントを使用して、サイトの自動ログオフをトリガーすることができます。

しかし、ブラウザが意図的に閉じられているかブラウザプロセスが外部で終了しているケース(これは2番目のケースでは起こっていないと思われます)を処理するかどうかはわかりません。

0

サイト内のすべてのナビゲーションが.NETポストバック(単純なhtmlリンクやjavascriptのopen文なし)で行われている場合、ページの読み込みがポストバックでない場合は、自動的にログオフしてログインページにリダイレクトできます。これは終了時にセッションを終了させませんが、手動でWebアプリケーションに移動する場合はログインを強制するため、セッションのように見えます。すべてのページでこの機能を使用するには、Page_Loadでマスターページを使用します。

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     System.Web.Security.FormsAuthentication.SignOut(); 
     System.Web.Security.FormsAuthentication.RedirectToLoginPage(); 
    } 
} 
関連する問題