2012-01-26 14 views
6

セッションIDが既存のリクエストコンテキスト内で有効かどうかを調べる方法はありますか?その中で、私がセッションIDを与えられていて、現在HTTPリクエストによって開始された別のセッションに入っていて、ページ上またはクラス内にある場合、有効で現在存在する場合、そのセッションIDを検証できますか?放棄されていないのですか?ASP.Netでは、別のセッションが存在するか、セッションIDによって有効かどうかを調べることはできますか?

これは、私が作業しているプロジェクトのページでユーザーログインプロセスをロックダウンする必要があるため、ユーザーは一度しかログインできないためです。これについて私の考えは、nullの場合はセッションテーブルのidカラムを追加することでした。ログアウトすると、ログイン時に設定され、ログアウト時にクリアされます。またはglobal.asaxでSession_Endにクリアされます。しかし何らかの理由でセッションがクリアされずに放棄された場合は、再度ログインする必要があります。その場合、ログインしてそのIDのセッションIDを見つけると、何とかセッションIDは、アクティブかつ有効であることかどうかをチェックし、いない場合、それは彼らの新しいセッションIDにそれをリセットし、それらは、ログインすることができます。

おかげ

+0

セッションを永遠に維持する必要がありますか? ASP .NETが最終的に期限切れのセッションを放棄することを意味します。しかし、アプリケーションの状態は常に同じままにする必要がありますユーザーの観点から? – Yuck

+0

私たちは、30分のタイムアウトがあり、ユーザーにログインする必要があります。クッキーベースの認証、アクティブなセッションだけを使用したり、ユーザーオブジェクトを格納したりしていません。セッションがタイムアウトすると、「ログアウト」され、再度ログインする必要があります。 –

答えて

0

をのSessionIdを検証する直接的な方法はありません。オプション:

  • 独自のセッション状態プロバイダ(ID管理者でも構わない)を実装して、その情報へのアクセスを公開することができます(http://msdn.microsoft.com/en-us/library/aa479024.aspx)。
  • 現在のユーザーが持っているはずのIDに基づいてセッションID Cookieを設定し、ページを再レンダリングするだけです。 1秒のリクエストで、そのIDが有効な状態に対応しているかどうかを確認し、必要に応じて再ログインすることができます。

注:実装の詳細に頼るため、セッションIDを使用しないでください。このユーザーの最新のように見えないセッションを単に拒否すると効果があります。 Session["someName"]とユーザDBに保存された「現在のセッション名」プロパティを使用すると、古いセッションのレンダリングを拒否することができます。

2

以前に検索するには、データベースにセッションを保存する必要があります。
は、私が考えることができる唯一の方法はNeperzが言うように行うと、あなたが利用可能であるかを確認するSQLクエリを使用することができることを意味し、SQLServerセッションプロバイダを使用してデータベースにあなたのセッションを保存することですHOW TO: Configure SQL Server to Store ASP.NET Session State

+0

上記のコメントは悪い英語ですが、正しい考えです。あなたのセッション状態にSQLサーバを使用した場合、セッションIDをカラムとして保存すると思います。あなたはそれを確認することができます。 – Rocklan

1

もっと見ます。

しかし、考慮すべきいくつかの注意点があります。

  1. 私はセッションデータベーステーブルに格納されたセッションIDが正確にないあなたがコードからアクセスできるセッションIDと同じと考えています。私はこれを読んだ場所を正確に思い出すことはできませんが、私はすべてのアクティブなセッションを監視するために同様のことをしていたときにこの問題を経験したと思います。
  2. グローバルSession_Endイベントは、SQLServerセッションプロバイダを使用する場合は発生しません。
  3. 明示的にSession.Abandon()をコード内で使用してセッションを終了しない限り(ユーザーがログアウトしたときなど)、SQLエージェントジョブが期限切れのセッションをクリーンアップするまで、セッションはハングアップする可能性があります。つまり、誰かがブラウザウィンドウを閉じただけでセッションが「アクティブ」として表示され、実装が複雑になる可能性があります。
1

あなたが/ WeakReferencesを使用することです:-)持っていた別のオプション:

  • Dictionary<youruseridtype,WeakReference>はあなたが、セッション開始時にアプリケーション[ "mySessionDictionnary"]
  • としてアプリケーションレベルで保存されていますユーザがログインしたいときは、Dictionnary
  • のSessionオブジェクトにUserIDとWeakReferenceを格納し、自分のIDをDictionnaryにチェックインします。 Sessionオブジェクトに対するWeakReferenceが空でない場合は、この既存のSessionオブジェクトをAbandon()することができます。これにより、ユーザーあたりアクティブなセッションが1つしかないことが保証されます。

WeakReferenceを使用すると、メモリリークが発生しないことが保証されます。

注:これは、inProcセッション管理でのみ機能します。 Dictionaryはアプリケーションを再起動しても生き残ることができないので、セッションでも同じでなければなりません。

あなたの問題に対する正しい答えがすでに見つかりました。

関連する問題