連載
» 2009年08月14日 00時00分 公開

連載:ASP.NET MVC入門:第4回 フィルタ属性による認証/キャッシュ/セキュリティ対策の実装 (1/5)

ASP.NET MVCでは、認証やキャッシュ、セキュリティなどの付加機能を、本体のロジックとは別に、属性としてアプリケーションに追加できる。

[山田祥寛(http://www.wings.msn.to/),著]
連載:ASP.NET MVC入門
Insider.NET

 

「連載:ASP.NET MVC入門」のインデックス

連載目次

 本連載では、.NET Frameworkの新たなアプリケーション・フレームワークであるASP.NET MVCを基礎から解説している。前回までで、Model−View−Controllerを構成する基本的な要素、そして、アクション・メソッドの挙動を制御するためのActionResultオブジェクトについて解説した。

 今回扱うのは、(コントローラの)アクション・メソッドに付随的な機能を追加するためのフィルタ属性(FilterAttribute)である。

 フィルタ属性を利用することで、アクション・メソッド、またはコントローラ・クラスに対して、認証や出力キャッシュ、セキュリティ対策といったさまざまな付随機能を、既存のロジックそのものには影響を与えることなく追加できる。

 フィルタ属性は自分で定義することも可能であるが、まずは基本を押さえるという意味で、本稿ではASP.NET MVCが標準で備えるフィルタ属性(表1)について紹介していくことにしよう。

属性 概要
AuthorizeAttribute 認証機能を付与する
HandleErrorAttribute カスタム・エラー・ページを有効化する
OutputCacheAttribute 出力キャッシュ機能を有効化する
ValidateInputAttribute リクエスト・データの検証機能を有効化する
ValidateAntiForgeryTokenAttribute CSRF(Cross-Site Request Forgeries:クロスサイト・リクエスト・フォージェリ)対策を有効化する
表1 ASP.NET MVC標準のフィルタ属性一覧

 フィルタ属性は、その名前のとおり属性の一種で、コントローラ・クラス、もしくは個々のアクション・メソッドに対して指定できる。

 まずは、フィルタ属性を適用した具体的なコードの例からだ。まだ個々のフィルタ属性について理解している必要はない。ここではフィルタ属性とはこのように書くものだ、という点に注目して次のコードを見てほしい。

[HandleError()] (1)
public class ResultController : Controller {

  ……中略……

  [Authorize()]
  [OutputCache(Duration=120, VaryByParam="*")] (2)
  public String Dummy() {

      ……中略……

  }
}

<HandleError()> _ (1)
Public Class ResultController
    Inherits System.Web.Mvc.Controller

  ……中略……

  <Authorize()> _
  <OutputCache(Duration:=120, VaryByParam:="*")> _ (2)
  Function Dummy() As String

    ……中略……

  End Function
End Class

リスト1 フィルタ属性の基本的構文(上:C#、下:VB)

 この場合であれば、HandleError属性(フィルタ)はResultコントローラ全体に対して適用されるが((1))、Authorize属性やOutputCache属性は、Result/Dummyアクションに対してのみ適用されることになる((2))。また、フィルタ属性は通常の属性と同様、コントローラ・クラス、アクション・メソッドいずれの階層に対しても、複数同時に適用することが可能だ。

 複数のフィルタが同時に適用された場合には、

   AuthorizeAttribute/ValidateInputAttribute/
ValidateAntiForgeryTokenAttribute

OutputCacheAttribute

HandleErrorAttribute

の順序で実行されることになる*1。また、同じ種類の属性が同時に適用された場合には、まずは記述順に優先されると考えておけばよいだろう(明示的に実行順序を強制する方法もあるが、これについてはあらためて後述する)。

*1 実際には、それぞれの属性がIAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilterインターフェイスのいずれを実装しているかどうかによる。


 それでは、ここからは個々のフィルタ属性について見ていこう。

ページ・キャッシング機能を有効化する − OutputCache属性 −

 OutputCache属性を利用することで、ページ(アクション)に出力キャッシュ機能を追加できる。出力キャッシュといえば、「@OutputCacheディレクティブ」を思い出す方も多いかもしれないが、ASP.NET MVCでは@OutputCacheディレクティブは利用できないので、注意してほしい。

 もっとも、OutputCache属性の概念は、@OutputCacheディレクティブによく似ているので、@OutputCacheディレクティブを理解しているならば、使い方で迷うことはないだろう。

 例えば、Result/Currentアクションに対して、キャッシュ機能を有効にしたいならば、以下のようなコードを記述するだけでよい。

[OutputCache(Duration=120, VaryByParam="*")]
public String Current() {
  return String.Format("現在時刻は{0}です。",
    DateTime.Now.ToLongTimeString());
}

<OutputCache(Duration:=120, VaryByParam:="*")> _
Function Current() As String
  Return String.Format("現在時刻は{0}です。", _
    DateTime.Now.ToLongTimeString())
End Function

リスト2 出力キャッシュを有効にするためのコード(上:ResultController.cs、下:ResultController.vb)

 以下はこれを実行した例だ。


120秒以上経過してからリロードした場合のみ

図1 Result/Currentアクションの実行結果
120秒以内にリクエストを繰り返した場合には、表示時刻は変化しない。120秒以上経過したところでアクセスすると、キャッシュが破棄され、表示もリフレッシュされる。

 OutputCache属性で指定できるプロパティは、次のとおりである。表1を見ても、@OutputCacheディレクティブの場合とほとんど使えるプロパティは変わらないことがお分かりいただけるはずだ。関連する記事についても併せて紹介しているので、理解を深めるための参考にしていただきたい。

表2 OutputCache属性で利用可能な主なプロパティ 

       1|2|3|4|5 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。