Делаем свою капчу (asp.net, c#)

Механизм капчи такой: генерируем картинку с рандомным кодом из символов, запоминаем этот код в сессии, показываем поле пользователю для ввода кода с картинки и после отправки этого поля, делаем проверку на совпадение этого кода с кодом хранящимся в сессии.

  1. Создадим класс, который будет генерировать код и создавать картинку
    public class SimpleCaptcha
    {
        public string Generate(Stream stream)
        {
            string captcha = GenerateRandomString();
    
            int height = 40;
            int width = 160;
    
            using (Bitmap bmp = new Bitmap(width, height))
            {
                RectangleF rectf = new RectangleF(30, 5, 0, 0);
    
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.Clear(Color.White);
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    g.DrawString(captcha, new Font("Georgia", 18, FontStyle.Italic), Brushes.Aquamarine, rectf);
                    g.DrawRectangle(new Pen(Color.BurlyWood), 1, 1, width - 2, height - 2);
                    g.Flush();
                    bmp.Save(stream, ImageFormat.Jpeg);
                }
            }
            return captcha;
        }
        private string GenerateRandomString()
        {
            Random random = new Random();
            string combination = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 6; i++)
                sb.Append(combination[random.Next(combination.Length)]);
    
            return sb.ToString();
        }
    }
    
  2. Создадим контроллер, который будет создавать капчу
    public void Captcha()
    {
        Response.Clear();
        Response.ContentType = "image/jpeg";
        Session["captcha"] = new SimpleCaptcha().Generate(Response.OutputStream);
    }
    

Используем так:

  1. Создадим еще два контроллера
    public ActionResult TestCaptcha()
     {
     return View();
     }
     [HttpPost]
     public string TestCaptcha(string captcha)
     {
     return string.Equals(Session["captcha"], captcha) ? "OK" : "NO";
     }
    
  2. Создадим представление TestCaptcha.cshtml
    @{
     Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>TestCaptcha</title>
    </head>
    <body>
        <form method="POST">
            <img src="@Url.Action("Captcha", "Common")" onclick="this.src = this.src.split('?')[0] + '?' + new Date()" style="cursor: pointer;" title="Обновить"/>
            <div class="form-group">
                <label class="col-md-3 control-label">Введите код на картинке</label>
                <div class="col-md-9">
                    <input name="captcha" type="text" class="form-control" />
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-3 col-md-9">
                    <button type="submit" class="btn btn-default">Проверить</button>
                </div>
            </div>
        </form>
    </body>
    </html>
    

Ссылки: