ASP.NETでDBと接続するWebアプリやXML Webサービスを作成するときのDBユーザには何を使用するのが適切なのでしょうか。
ASP.NETのサンプルなどではweb.configの中で接続文字列を指定して(当然、web.configは運用環境に設定するときには暗号化)いる例を良く見かけます。この方法の利点は何でしょうか。
- 説明が簡単になる
- web.configの中に接続文字列があるため、DBに接続するユーザIDやパスワードを入力するログイン画面を用意しなくても良いので、DB使ったサンプルコードの総量が少なくてすみます。
- また、前振りとして「認証」というものに触れなくても良いため全体的に簡単なイメージを当たられます。
- コネクションプーリングが有効活用できる
- コネクションプーリングとはアプリケーションとしてはDBとの接続を切断してもDBとの接続層がコネクションを維持していて、アプリケーションから再度接続があったときに維持していたコネクションを使いまわすことで再接続時間を限りなくゼロに近付ける事ができる技術です。
- この仕組みが働くためには接続文字列が同一である必要があるため、web.configに記述された接続文字列に統一されていると有利(かも?)
それでは、web.configに接続文字列を記述して使う方法だけが、WebアプリからDBに接続する方法なのでしょうか。
イントラネットなどであればWindows認証を使うのも手段ですがインターネットで使うWebアプリであったとしても、そのほかの方法はあります。
例えば、web.configでフォーム認証(IISとしては匿名認証となる)を指定して次のような動きのログインページを使ってDBに接続する方法です。
- ログインページを使ってDBに接続するためのIDとパスワードを入力
- ログインページで入力したIDとパスワードでDBにログイン
- ログインに成功したら認証チケットを生成
- 生成した認証チケットをCookieとしてブラウザに返却
さて、WebアプリではDBを使うたびに接続と切断を繰り返す事になります。この方法を採用した場合にログインページではDBに接続するIDとパスワードは入力されるので分かりますが、ログイン後(認証後)のページでDBと接続するときのIDとパスワードはどうやって入手するのでしょうか。認証チケットをDBとの接続にも利用できると良いのですが、そう上手くはいきません。
そこで、認証後なのでパスワードは本来不要なはずですが、認証チケット自体ではDBに接続できないのでログインページで認証に使ったIDとパスワードをどこかに記録して使う必要があります。
- 認証チケットのUserDataプロパティの中に暗号化して忍び込ませておく
- 認証チケット方式ではDBパスワードを含んだ認証チケットの内容がCookieとしてブラウザ側に送られる
- Sessionオブジェクトに忍び込ませておく
- DBパスワードはサーバー側に記録されセッションIDを詰めたSessionCookieだけがブラウザ側に送られる
このどちらの方がよりよい実装方法かという点ですが、Cookieにパスワードが直接含まれないSessionオブジェクト方式の方がよさそうに思えます。
なお、フォーム認証でログインページに入力したIDやパスワードはhttpでは入力された値そのものがネットワーク上を流れるためSSLを適用するのが必須ですし、認証チケットやSessionオブジェクトに絡んでやりとりされるCookieについてもセッションハイジャックを防止するためにSSLの適用が必須になります。また、CookieをSSL外に出さない設定や有効期限などにも注意を払ってあることが前提としてあります。
このようにして作成したDB接続方法ですが、web.config方式の利点として考えられているコネクションプーリングについてはどうでしょうか。
コネクションプーリングは接続文字列が同一のものならばプーリングされている(以前接続して今は使っていない)コネクションを使いまわしますが、DBに接続するIDとパスワードが認証したユーザ毎に異なってしまうとIDとパスワードが含まれている接続文字列も異なってしまいますので、利用者をまたがってコネクションプーリングは働きませんが、同一利用者であれば接続文字列も同一になるのでコネクションプーリングが働きWebアプリのようにDBに接続と切断を繰り返すような使い方をしても再接続時間短縮に効果があります。
メモ:コネクションプーリングに関連するODP.NETの接続文字列
- Pooling
- Connection Lifetime
- Connection Timeout
- Max Pool Size
- Min Pool Size
- Incr Pool Size
- Decr Pool Size
- Validate Connection