ASP.NET COREでSessionState

投稿者: | 2017年5月25日

ASP.NET COREの1.1系で勉強がてら適当なアプリ作成していてSession Stateについて調べたので備忘です。

Azureで運用するのを前提にRedis CacheやDocument DB(今はもうCosmos DB)の利用も考えたのですが、そこまで大規模に利用するアプリでもないのでSQLDatabaseでSessionStateすることにしました。RedisCache高いよね・・・、メモリキャッシュだから仕方ないのは解っているのですが。

WebアプリをホストするサーバのInPorcでもいいっちゃいいんですがスケールアウトとか考えて後から実装するとなるとやはり面倒なのでせめてDB Stateかなと考えてSQLDatabaseを選択したわけです。メモリキャッシュよりは反応が遅くなりますが安価なので汎用性は高いです。

少し古い情報になるのですが下記の記事を参考に作成しています。

Working with a distributed cache

 

※この記事は2017年5月25日時点の情報となります。

 

前提

Visual Studio 2017でASP.NET Core Webアプリケーションを作成します。

作成時に「認証の変更」で「個別のユーザカウント」を選択してしてください。

 

Extensionの取得

nugetで下記のExtensionを取得してください。Sql Serverを利用したセッション管理機能を提供してくれるパッケージです。

 

SQL Databaseにキャッシュテーブルを作成する

ここではSQLDatabaseの作成方法については割愛します。

とりあえず以下のDDLを実行してテーブルを作成します。作成したテーブルでログイン後のSession情報を管理コントロールします。

 

SQLServer Session Stateを実装する

Startup.csのConfigureServicesに下記を追加します。今回は接続文字列をユーザシークレット管理に記載して取得します。Configuration[“ConnectionsString:DbConnection”]の部分がユーザシークレット管理部分になりますのでここを接続文字列に置き換えるかユーザシークレット管理を利用するかしてください。

セッションタイムアウトの時間は30分を指定します。ここは明示的に指定していない場合は20分になります。

次にStartup.csのConfigureにSessionの登録をします。

これで設定関連は完了です。

 

Sessionが切れた時に特定のページに遷移させる方法

セッションが切れたときの挙動については要件によって変わってくると思いますが大体ログインページに遷移すると思います。というわけでここではログインページに遷移する方法について記載します。

まずは以下の2つのクラスを実装します。

  • HttpHelperの実装

Session情報はHttpContextに格納されるのですがHttpContextはどこからでもアクセスできるわけではないのでアクセサ用のインターフェースをきります。HttpHelperというフォルダを追加してHttpHelperクラスを作成し下記のコードを転写してください。

次にStartup.csのConfigureに下記のソースを追加しHttpHelperの利用登録をします。

 

  • カスタムアトリビュートの実装

セッションが切れた時の動作をカスタムアトリビュートとして実装します。カスタムアトリビュートで実装しておけばControllerにセットするだけで処理されるようになりますしSession管理が不要なControllerではセットしないようにすればいいので汎用性が高くなります。

Atrributesというフォルダを作成してCheckSessionOutAttributeクラスを作成します。処理として特定のSessionKey、ここでは「OperationTime」が存在するか確認してなければログインページに遷移するという処理になっています。

 

次にビジネスロジック側に実装を行います。

ログイン処理の部分でセッション追加の処理を記載します。ここではログイン時間をセッションにセットしています。

 

次にセッション管理を行いたいControllerにカスタムアトリビュートを実装すれば実装は完了です。

 

セッションタイムアウトを1分にして確認してみましょう。

DBのセッションテーブルにセッション情報が書き込まれるので確認してください。デフォルトではSlide方式になっているので何かしらのアクションを起こせばSessionExpirationTimeが設定時間分延長して更新されます。ログインしてから何もせずにExpirationTimeを待ってアクションを起こしログイン画面に遷移すれば成功です。

これで冗長構成をもったセッション管理の仕組みをASP.NET Coreで利用することができます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA