2011年3月23日水曜日

ASP.NET MVCでCaptcha(キャプチャ)を使う

My Clipでもキャプチャを実装していたのだが、今回チヌかかり釣りMEGAでも同様のことをやりたかったので、昔のソースコードを引っ張り出してきて再確認したので、それをまとめておく。

使用しているのは下記ブログポストで紹介されているライブラリ。
ASP.NET MVC CAPTCHA

※最新のソースコードは下記ブログポストらしいのだが、ダウンロードしたバイナリをMVC 3の環境に組み込んでも参照しているアセンブリバージョンの兼ね合いでコンパイルができないので、今回はMy Clip実装時の上記ブログポストのソースコードで実装方法を紹介する。
MVC CAPTCHA for Preview Release 3

  1. 上記のリンクからソースコードをダウンロードし、ManagedFusion.Web のプロジェクトをコンパイルする
  2. コンパイルしてできた ManagedFusion.dll と ManagedFusion.Web.dll を ASP.NET MVC 3 のプロジェクトで参照する

3, 下記を web.config に追加する
<httpHandlers>
 <add verb="GET" path="captcha.ashx" validate="false" type="ManagedFusion.Web.Mvc.Handlers.CaptchaImageHandler, ManagedFusion.Web"/>
</httpHandlers>

4, 下記を Global.asax に追加する
public static void RegisterRoutes(RouteCollection routes)
{
 routes.IgnoreRoute("{handler}.ashx");
}

5, cshtml に下記を追加する
<div>
    @Html.Raw(Html.CaptchaImage(50, 180))
</div>
<div>
    @Html.Raw(Html.CaptchaTextBox("captcha"))
</div>
Html.Raw で囲んでいるのは CaptchaImage, CaptchaTextBox ともに文字列を返却するようになっているため。ソースコードを書き換えて各関数ともに文字列ではなく MvcHtmlString を返却するようにすれば Raw で囲む必要はなくなる。

6, コントローラーアクションに下記属性を追加する
 [CaptchaValidation("captcha")]
 [HttpPost]
 public ActionResult Register(RegisterModel model, bool captchaValid)
 {
   // Do something
 }
captchaValid にキャプチャでの検証結果が代入されている。

以上で5でコードを追加した cshtml を表示するばキャプチャが表示されているはずだ。

0 件のコメント:

コメントを投稿