フリーのキャプチャ ASP.NET サーバーコントロール を使用する機会があったので、簡単な使い方のメモを記載します。

検証環境は次の通り

  • Visual Studio 2013 Premium
  • ASP.NET Web Forms アプリケーション

MS Captcha コントロールのダウンロードや、公式のサイトで公開されているサンプルのダウンロードは次のリンクを参照してください。

ASP.NET CAPTCHA
http://kirsanov.net/page/ASPNET-CAPTCHA.aspx
CAPTCHA sample project
http://kirsanov.net/post/2011/10/28/CAPTCHA-sample-project.aspx

1. キャプチャコントロールのダウンロード

冒頭で紹介したリンクから MS Captcha コントロールをダウンロードしてください。

2.サンプルプロジェクトの作成

Visual Studio を起動して新しくプロジェクトを作成します。テンプレートで ASP.NET Web アプリケーションを選択します。.NET Framework のバージョンは 4.5.1 を選択しました。

新規 ASP.NET プロジェクト ダイアログで テンプレートの選択で Empty を選択します。Web Forms にチェックをしてプロジェクトを作成します。

ソリューションエクスプローラー上で、 プロジェクトの参照設定を右クリック > 参照の追加 をクリックします。参照マネージャーダイアログで参照ボタンをクリックして、 MSCaptchar.dll の参照を追加します。

Web.config を MSCaptcha のサンプルページからダウンロードできる サンプルの Web.config を参考にして編集します。Web.config にはすでに system.web タグや compilation タグが存在するので、それらを上書きしないようにマージしてください。記事作成時点では空のWebサイトからMSCaptchaのハンドラ―の設定を追加した後はこのようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
    <!--<httpHandlers>
      <add verb="GET" path="CaptchaImage.axd" type="MSCaptcha.captchaImageHandler, MSCaptcha" />
    </httpHandlers>-->
  </system.web>
  <!-- The following section is only needed for IIS7 and up -->
  <system.webServer>
    <handlers>
      <add name="MSCaptcha.captchaImageHandler" verb="GET" path="CaptchaImage.axd" type="MSCaptcha.captchaImageHandler, MSCaptcha" resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>

あとは キャプチャコントロールを使用するように、簡単なサンプル Web フォームを作成します。デフォルトで作成あsれる Default.aspx ファイルを次のように編集します。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MSCaptcharSample.Default" %>

<%@ Register Assembly="MSCaptcha" Namespace="MSCaptcha" TagPrefix="cc1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            キャプチャ画像
            <cc1:CaptchaControl ID="CaptchaControl1" runat="server" Height="50px"
                Width="180px" CaptchaLength="5" BackColor="White"
                EnableViewState="False" />
            <br /><br />
        </div>
        <div>
            <asp:TextBox runat="server" ID="txtAnswer"></asp:TextBox>
            <asp:Button runat="server" ID="btnValidate" Text="確認" OnClick="btnValidate_Click" />
        </div>
        <div>
            <asp:Label runat="server" ID="lblResult"></asp:Label>
        </div>
    </form>
</body>
</html>

引き続き コードビハインドファイル (Default.aspx.cs) を次のように編集します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MSCaptcharSample
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            CaptchaControl1.CaptchaWidth = 200;
            CaptchaControl1.CaptchaHeight = 70;
            CaptchaControl1.CaptchaLength = 4;
        }

        protected void btnValidate_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtAnswer.Text))
            {
                lblResult.Text = "Please Input the Text in Captcha Image";
            }

            CaptchaControl1.ValidateCaptcha(txtAnswer.Text);

            if (CaptchaControl1.UserValidated)
            {
                lblResult.Text = "正解です";
            }
            else
            {
                lblResult.Text = "キャプチャのテキストと異なっています";
            }
        }
    }
}

ビルドしてエラーが発生しないことを確認します。

これで準備完了です。

F5ボタンでデバッグ実行して動作確認します。下図のようにキャプチャ画像が表示されるので、 画像に表示されたテキストを入力して 確認 ボタンをクリックします。

画像と一致するテキストを入力すると "正解です" メッセージが表示されます。

ロードバランスされた環境でMS Captcha コントロールを 使用する場合は CaptchaControl.CacheStrategy を 既定の httpRuntime ではなくて Session(サーバー間で共有されることが前提)やClientSideに設定する必要があると思われます。ClientSide にした場合は EnableViewState は true にしてください。

3.まとめ

説明は以上です。簡単なサンプルを掲載してみました。