設定
カスタムフォーム認証を使用しています-すべて標準的なものです。
アカウントコントローラーのログインアクションで、
- データベースに対してユーザーの詳細を確認します
- 成功した場合は、フォーム認証チケットを作成します
- ログインしたメンバーのデータベースの行 ID をチケットの UserData に格納します
- チケットを暗号化する
- チケットを Cookie に保存する
- Cookie を Reponse.Cookies コレクションに追加します。
- ホームコントローラーでのインデックスアクションにリダイレクト
AuthenticateRequest イベントのグローバル asax にハンドラーを登録しました。私のハンドラーでは、
- HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; から Cookie を取得します。
- Cookie が存在する場合、Cookie 内のフォーム認証チケットの値を復号化します
- 認証チケット UserData に格納されている Id を使用して、データベースからユーザーの詳細を取得します。
- カスタム プリンシパルを作成し、ユーザー (カスタム LoggedInUser プロパティを持つ) をデータベースから取得したユーザーに設定します。
- HttpContext.Current.User をカスタム プリンシパルに設定します。
問題
ログイン後にホームページのリクエストをデバッグすると、global.asax の AuthenticateRequest ハンドラがページ リクエストごとに複数回ヒットすることがわかりました。HttpContext.Current.Request.Path を確認しましたが、これは、ページ上の各リソース (事実上、すべての HTTP GET) が認証要求を発行しているためです。GET jquery.js、GET logo.png など...
質問
最初に処理された AuthenticateRequest で、db に移動し、HttpContext.Current.User をカスタム プリンシパルに設定します。AuthenticatRequest を起動させる後続の HTTP GET のためにデータベースにアクセスしないようにするための良い方法は何でしょうか。実際には、ユーザーがブラウザを閉じるか、認証チケットの有効期限が切れるまで、一度だけ認証を行います。
ティア