パイプライン処理にはまる

認証・許可の仕組みを,global.asaxのApplication_AuthenticateRequest/Application_AuthorizeRequestで実装したんですが,Application_AuthorizeRequestの処理結果をSessionに入れようとして例外発生.
理由は,このイベントが発生したときにSessionが作成されているとは限らないからです.
そこでApplication_AuthorizeRequestの代わりにSession_Startにしてみたら……そりゃうまくいくわけないよね.リクエストの単位で発生してくれないと意味がない.仕方ないのでApplication_AuthorizeRequestに戻して,Sessionがないときは一時的にHttpContext.Itemsに入れて,Session_Startが発生したらHttpContext.Itemsを見に行くような実装にしました.ちょっと怪しいけど,多分大丈夫でしょう.
それにしてもglobal.asaxの中にスコープの異なるメソッド(ハンドラ)がいっぱいあるのはややこしいですね.

  • アプリケーションスコープ(Application_Start/Application_End/Application_Error)
  • セッションスコープ(Session_Start/Session_End)
  • リクエストスコープ(Application_AuthenticateRequest/Application_AuthorizeRequest...)

で分かれてたほうがよかったような気がします.まぁ理解不足といってしまえばそれまでですけど.
やっぱりこういうのは頭で考えてるだけではダメですね.調査が全然甘いです.反省