巨大で複雑なフレームワークを使えと言われれば、それが自分が作ったものであっても、使いたがらないだろう。しかし、2、3のクラスだけで出来ている小さなライブラリを使うと一気に仕事が楽になる場合がある。このようなもののひとつがFormsAuthenticationExtensionsと呼ばれるプロジェクトだ。
MVC3のようなモダンなフレームワークでもフォーム認証は依然として、公開サイトの認証方法として推奨されている由緒ある方法だ。メンバシップとロールプロバイダと合わせて使えば、構成も簡単であり柔軟性もある。最も単純な場合、フォーム認証はユーザ名またはIDが暗号化され保存されたクッキーを使う。ユーザに関するこの他の方法は下記のような他の方法でアクセスしなければならない。
- Membership.GetUserを呼ぶ。デフォルトの実装を使うとデータベースへのラウンドトリップが発生する。これは確かな方法だが、権限の取得はやりにくく、ページライフサイクル上での権限の保管場所がデバッグを難しくする。
- 追加情報をセッションに保持する。この方法だとセッション状態を保持しなければならない。小さなサイトなら問題無いが、複数のウェブサーバを利用しなければならない場合は問題が発生する。
FormsAuthenticationExtensionsが提供するのは第3の方法だ。メンバシップキャッシュを作成したり、セッションサーバの準備をするかわりに、認証クッキーに追加情報を保存できる。下記は小さなMVCプロジェクトでこのライブラリを試してみたサンプルだ。このコードはAccountController.LogOnのデフォルトのコードを置き換える。
//FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
var ticketData = new NameValueCollection();
new FormsAuthentication().SetAuthCookie(model.UserName, model.RememberMe, ticketData);
ticketData["Name"] = model.UserName; ticketData["Key"] = membershipUser.ProviderUserKey.ToString(); ticketData["Email"] = membershipUser.Email;
このプロジェクトの創始者からの警告を一言。
サイズは常に問題になります。
この方法で保存した情報はフォームチケットに埋め込まれます。チケットは暗号化されユーザのブラウザに送られます。これ以後のすべてのリクエクトにおいて、このクッキー全体が送られ復号化されます。従って、大きいデータを保存するのは明らかに問題に成ります。2,3のシンプルな値だけを保存する必要があります。
取り立てて言うほどの依存性もないこのFormsAuthenticationExtensionsを使うのはNuGetパッケージをロードするのと同じくらい簡単だ。少しコードを変えるだけでいい。
もしあなたが他にも便利なライブラリを知っているなら、この記事のコメント欄やページトップの“Contribute News”リンクを使って教えてほしい。
if($("#home_