ASP.NET セッション状態の概要

更新 : 2007 年 11 月

ASP.NET セッション状態を使用すると、ユーザーの値を格納および取得できます。

このトピックの内容は次のとおりです。

  • 背景

  • コード例

  • クラス リファレンス

背景

ASP.NET セッション状態を使用すると、ユーザーが Web アプリケーションの ASP.NET ページ間を移動するときに、ユーザーの値の格納と取得を行うことができます。HTTP は状態のないプロトコルです。つまり、Web サーバーはページに対する HTTP 要求をそれぞれ独立した要求として処理します。サーバーは以前の要求中に使用された変数値の情報を保持しません。ASP.NET セッション状態は、一定の時間枠に同じブラウザから受け取った要求を 1 つのセッションとして認識し、そのセッションの間、変数値を保持できるようにします。ASP.NET セッション状態は、すべての ASP.NET アプリケーションで既定で有効になります。

セッション状態の代わりに、次を使用できます。

  • ASP.NET アプリケーションのすべてのユーザーがアクセスできる変数を格納するアプリケーション状態

  • ユーザー値を有効期限切れにすることなく、データ ストアに永続化するプロファイル プロパティ

  • すべての ASP.NET アプリケーションが使用できるメモリに値を格納する ASP.NET キャッシュ

  • ページの値を永続化するビューステート

  • Cookie

  • HTTP 要求から利用できる、HTML フォームのクエリ文字列とフィールド

各種の状態管理オプションの比較については、「ASP.NET の状態管理に関する推奨事項」を参照してください。

セッション変数

セッション変数は HttpContext.Session プロパティを介して公開される SessionStateItemCollection オブジェクトに格納されます。ASP.NET ページでは、現在のセッション変数は Page オブジェクトの Session プロパティを介して公開されます。

セッション変数のコレクションは、変数名別または整数インデックス別にインデックス処理されます。セッション変数を作成するには、名前を指定してセッション変数を参照します。セッション変数を宣言したり、明示的にコレクションに追加したりする必要はありません。次の例では、ユーザーの名と姓を表すセッション変数を ASP.NET ページで作成し、それぞれに TextBox コントロールから取得した値を設定します。

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

セッション変数には任意の有効な .NET Framework 型を指定できます。StockPicks という名前のセッション変数に ArrayList オブジェクトを格納する例を次に示します。StockPicks セッション変数によって返される値は、SessionStateItemCollection からの取得時に適切な型にキャストする必要があります。

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
ms178581.alert_note(ja-jp,VS.90).gifメモ :

InProc 以外のセッション状態モードを使用する場合、セッション変数の型はプリミティブ .NET 型であるか、シリアル化できる必要があります。理由は、セッション変数値が外部のデータ ストアに格納されるためです。詳細については、「セッション状態モード」を参照してください。

セッション ID

セッションは、SessionID プロパティを使用して読み込むことができる一意識別子によって識別されます。ASP.NET アプリケーションでセッション状態が有効になっている場合、アプリケーション内のページへの各要求について、ブラウザから送信された SessionID 値がチェックされます。SessionID 値が提供されていない場合、ASP.NET は新しいセッションを開始し、そのセッションの SessionID 値が応答と共にブラウザに送信されます。

既定では、SessionID 値は Cookie に格納されます。ただし、"Cookie なしの" セッションについては SessionID 値を URL に格納するようにアプリケーションを設定することもできます。

セッションは、要求が同じ SessionID 値で行われ続ける限りはアクティブと見なされます。あるセッションの要求から次の要求までの時間が、指定されているタイムアウト値 (分) を超えると、セッションは有効期限切れと見なされます。有効期限切れの SessionID 値で要求が行われると、新しいセッションが開始されます。

ms178581.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

P:System.Web.SessionState.HttpSessionState.SessionID 値は、Cookie としても URL の一部としてもクリア テキストで送信されます。悪意のあるユーザーが SessionID 値を取得し、それをサーバーへの要求に含めれば、他のユーザーのセッションにアクセスできます。そのため、機密情報をセッション状態に格納する場合は、SSL を使用して、SessionID 値を含む、ブラウザとサーバー間の通信を暗号化することをお勧めします。

既定では、SessionID 値はブラウザの無期限セッション Cookie に格納されます。ただし、セッション ID が Cookie に格納されないようにすることもできます。このためには、Web.config ファイルの sessionState セクションで、cookieless 属性を true に設定します。

次の例は、Cookie なしのセッション ID を使用するように ASP.NET アプリケーションを構成する Web.config ファイルを示しています。

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

ASP.NET は、一意のセッション ID をページの URL に自動的に挿入して、Cookie なしのセッション状態を保持します。たとえば、次の URL は ASP.NET によって変更され、lit3py55t21z5v55vlm25s55 という一意のセッション ID が挿入されています。

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

ブラウザへのページの送信時、ASP.NET は、ページ内でアプリケーション相対パスを使用しているリンクにセッション ID 値を埋め込み、リンクを変更します (絶対パスを使用しているリンクは変更されません)。この方法で変更されたリンクをユーザーがクリックする限り、セッション状態は保持されます。ただし、アプリケーションから提供された URL をクライアントが書き直した場合、ASP.NET は、セッション ID を解決して要求を既存のセッションに関連付けることができなくなります。この場合、要求に対して新しいセッションが開始されます。

セッション ID は、URL 内のアプリケーション名の後のスラッシュと、残りのファイル ID または仮想ディレクトリ ID の間に埋め込まれます。これにより、ASP.NET は、アプリケーション名を解決してから、SessionStateModule を要求に含めることができます。

ms178581.alert_note(ja-jp,VS.90).gifメモ :

アプリケーションのセキュリティを向上するには、ユーザーがアプリケーションからログアウトできるようにし、ログアウトする時点で、アプリケーションが Abandon メソッドを呼び出すようにする必要があります。これにより、悪意のあるユーザーが URL 内の一意識別子を取得し、セッションに格納されているユーザーの個人データを取得する危険性が低減されます。

期限切れのセッション ID の再生成

既定では、Cookie なしのセッションで使用されるセッション ID 値は再利用されます。つまり、期限切れのセッション ID によって要求が行われた場合、その要求に含まれている SessionID 値を使用して新しいセッションが開始されます。この結果、Cookie なしの SessionID 値を含むリンクが複数のブラウザで使用される場合には、セッション データが意図に反して共有される可能性があります。このような状況が発生する可能性があるのは、検索エンジン、電子メール メッセージ、または他のプログラムを通じてリンクが渡された場合です。セッション データが共有される可能性を低減するには、セッション ID の再利用を行わないようにアプリケーションを構成します。これを行うには、sessionState 構成要素の regenerateExpiredSessionId 属性を true に設定します。このようにすると、期限切れのセッション ID によって Cookie なしのセッション要求が行われたときに、新しいセッション ID が生成されるようになります。

ms178581.alert_note(ja-jp,VS.90).gifメモ :

期限切れのセッション ID による要求が HTTP POST メソッドを使用して行われたときに、regenerateExpiredSessionId が true の場合、ポストされたデータがすべて失われます。ブラウザが URL の一部として新しいセッション ID を使用するように、ASP.NET がリダイレクトを実行するためです。

カスタム セッション ID

SessionID 値の提供と検証を行うために、カスタム クラスを実装できます。このためには、SessionIDManager クラスを継承するクラスを作成し、CreateSessionID メソッドおよび Validate メソッドを独自の実装でオーバーライドします。具体的な方法については、CreateSessionID メソッドで示されている例を参照してください。

ISessionIDManager インターフェイスを実装するクラスを作成すると、SessionIDManager クラスを置き換えることができます。たとえば、Web アプリケーションで、ISAPI フィルタを使用して ASP.NET 以外のページ (HTML ページやイメージなど) に一意識別子を関連付けることができます。この一意識別子を ASP.NET セッション状態で使用するには、カスタム SessionIDManager クラスを実装します。カスタム クラスが Cookie なしのセッション ID をサポートしている場合は、URL 内のセッション ID を送信および取得するためのソリューションを実装する必要があります。

セッション モード

ASP.NET セッション状態では、セッション変数の格納オプションがいくつかサポートされています。各オプションは、セッション状態 Mode の種類として識別されます。既定の動作では、セッション変数は ASP.NET ワーカー プロセスのメモリ空間に格納されます。ただし、別のプロセス、SQL Server データベース、またはカスタム データ ソースにセッション状態が格納されるように指定することもできます。アプリケーションでセッション状態を有効にしない場合は、セッション モードを Off に設定します。

詳細については、「セッション状態モード」を参照してください。

セッション イベント

ASP.NET には、ユーザー セッションの管理に役立つ 2 つのイベントが用意されています。1 つは新しいセッションが開始されたときに発生する Session_OnStart イベントで、もう 1 つはセッションが放棄されるか有効期限が切れたときに発生する Session_OnEnd イベントです。セッション イベントは、ASP.NET アプリケーションの Global.asax ファイルで指定されます。

セッションの Mode プロパティが既定のモードである InProc 以外の値に設定されている場合、Session_OnEnd イベントはサポートされません。

ms178581.alert_note(ja-jp,VS.90).gifメモ :

ASP.NET アプリケーションの Global.asax ファイルまたは Web.config ファイルが変更されると、アプリケーションは再開され、アプリケーション状態またはセッション状態に格納されていた値は失われます。ウイルス対策ソフトウェアには、アプリケーションの Global.asax ファイルまたは Web.config ファイルの最終変更日時を更新できるものもあります。

詳細については、「セッション状態イベント」を参照してください。

セッション状態の設定

セッション状態は、system.web 構成セクションの sessionState 要素を使用して設定されます。また、@ Page ディレクティブの EnableSessionState 値を使用してセッション状態を設定することもできます。

sessionState 要素を使用すると、次のオプションを指定できます。

  • セッションのデータの格納モード

  • クライアントとサーバー間でのセッション ID 値の送信方法

  • セッションの Timeout

  • セッションの Mode 設定に基づくサポート値

アプリケーションを SQLServer セッション モードに構成する sessionState 要素の例を次に示します。Timeout 値を 30 分に設定し、セッション ID を URL に格納することを指定しています。

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

セッション状態モードを Off に設定することによって、アプリケーションのセッション状態を無効にできます。アプリケーションの特定ページだけのセッション状態を無効にする場合は、@ Page ディレクティブの EnableSessionState 値を false に設定します。また、EnableSessionState 値を ReadOnly に設定して、セッション変数に読み取り専用アクセスを指定することもできます。

現在の要求とセッション状態

ASP.NET セッション状態へのアクセスは、セッションごとに排他的です。つまり、2 人のユーザーが同時に要求を行った場合、別々のセッションへの同時アクセスは許可されます。ただし、2 つの同時要求が (同じ SessionID 値を使用して) 同じセッションに対して行われた場合、最初の要求がセッション情報への排他的アクセスを取得します。2 つ目の要求は、最初の要求が完了した時点で実行されます。最初の要求がロック タイムアウトを経過したことによって情報への排他的なロックが解除された場合も、2 つ目のセッションがアクセスを取得します。@ Page ページ ディレクティブの EnableSessionState 値が ReadOnly に設定されている場合、読み取り専用のセッション情報を要求しても、セッション データへの排他的ロックは生じません。ただし、セッション データに対する読み取り専用要求は、セッション データの読み取り/書き込み要求によるロックが解除されるまで、待機する必要があります。

ページのトップへ

コード例

方法 : セッション状態の値を保存する

方法 : セッション状態から値を読み取る

セッション状態ストア プロバイダの実装

ページのトップへ

クラス リファレンス

System.Web.SessionState 名前空間のセッション状態に関連する主要なクラスの一覧を次の表に示します。

メンバ

説明

SessionIDManager

ASP.NET セッション状態の一意識別子を管理します。

SessionStateItemCollection

セッション状態変数の格納に使用します。

ページのトップへ

参照

概念

セッション状態ストア プロバイダの実装