ساخت تصویر امنیتی Captcha با Generic Handler ها

ساخت تصویر امنیتی Captcha با استفاده از Handler ها در این مقاله قصد داریم توسط Generic Handler ها تصویر امنیتی برای سایتمون درست کنیم

ساخت تصویر امنیتی Captcha با Generic Handler ها

ابتدا روی نام پروژه کلیک راست کرده و Add New Item را بزنید و یک Item از نوع Generic Handler با نام Captcha اضافه کنید

سپس کدهای زیر را در آن قرار دهید

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace Captcha_Handler_Example
{
    /// <summary>
    /// Summary description for Captcha
    /// </summary>
    public class Captcha : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            using (Bitmap b = new Bitmap(250, 50))
            {
                Font f = new Font("Arial Black", 20F);
                Graphics g = Graphics.FromImage(b);
                SolidBrush whiteBrush = new SolidBrush(Color.Black);
                SolidBrush blackBrush = new SolidBrush(Color.White);
                RectangleF canvas = new RectangleF(0, 0, 250, 50);
                g.FillRectangle(whiteBrush, canvas);
                context.Session["Captcha"] = GetRandomString();
                g.DrawString(context.Session["Captcha"].ToString(), f, blackBrush, canvas);
                context.Response.ContentType = "image/gif";
                b.Save(context.Response.OutputStream, ImageFormat.Gif);
            }
           
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        private string GetRandomString()
        {
            string[] arrStr = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,A,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0".Split(",".ToCharArray());
            string strDraw = string.Empty;
            Random r = new Random();
            for (int i = 0; i < 5; i++)
            {
                strDraw += arrStr[r.Next(0, arrStr.Length - 1)];
            }
            return strDraw;
        }
    }
}

 

توضیحی در رابطه با کدها

اگر در تعریف نام کلاس دقت کنید از IRequiresSessionState نیز ارث بری کرده به این علت که بتونیم به Session دسترسی داشته باشیم و عبارت تولید شده را در Session نگه داریم برای چک کردن

  context.Session["Captcha"] = GetRandomString();

 

متد GetRandomString برای تولید یه عبارت 5 حرفی و به صورت تصادفی است

        private string GetRandomString()
        {
            string[] arrStr = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,A,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0".Split(",".ToCharArray());
            string strDraw = string.Empty;
            Random r = new Random();
            for (int i = 0; i < 5; i++)
            {
                strDraw += arrStr[r.Next(0, arrStr.Length - 1)];
            }
            return strDraw;
        }

 

و در نهایت در صفحه Default یک image قرار میدیم  و ImageUrl را نام Handler قرار میدیم

<asp:Image ID="Image1" runat="server" ImageUrl="Captcha.ashx" />

با این کار تصویر تولید شده توسط Handler در image قرار خواهد گرفت

    <form id="form1" runat="server">
    <div style="direction: rtl;border: 1px solid gray;width: 250px;height: 200px;">
        <asp:Image ID="Image1" runat="server" ImageUrl="Captcha.ashx" /><br/>
        عبارت در تصویر را وارد کنید
        <br/>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="چک کن" />
        <br />
        <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="عبارت وارد شده صحیح نیست" ForeColor="Red" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
        <br/>
        <a href="http://barnamenevisan.org/">برنامه نویسان</a>
    </div>
    </form>

 

و در نهایت برای چک کردن عبارت وارد شده و عبارت داخل Session از یک CustomValidator استفاده میکنیم

       args.IsValid = (Session["Captcha"].ToString().ToLower() == TextBox1.Text);

 

نمونه هم ضمیمه کردم

موفق باشید

فایل های ضمیمه