原创

很久以前就在使用WebForm下面的一款验证码控件:SuperAuthenticationCode。但此验证码控件并不支持mvc,并且6年没更新了,也联系不到作者,所以抽了点时间将它反编译,修复一些Bug,支持mvc等升级优化,仍然支持WebForm,保留了所有的参数设置。

由于SuperAuthenticationCode本身并不开源,因此Dos.Captcha也不开源,对源码感兴趣的朋友可以直接反编译SuperAuthenticationCode或Dos.Captcha。

SuperAuthenticationCode相关介绍

1、SuperAuthenticationCode作者:http://blog.csdn.net/HHTecShare/article/details/6479449

2、该验证码控件的制作借鉴了网上一款名为“AuthCode”的控件,作者不详。

3、图像扭曲变形算法参考了“ChineseVerifyCode”验证码的方式,作者18470590,下载地址http://www.51aspx.com/CV/ChineseVerifyCode/

4、动态图像的编码使用了开源GIF编码器NGif,作者gOODiDEA.NET,下载地址http://www.codeproject.com/KB/GDI-plus/NGif.aspx

上几张验证码效果图:

  

升级日志:

*)支持mvc。

*)修复不能设置字体集的bug。

*)增加自定义验证码SessionName。

*)修改一些参数名称。

*)修复NGif数组溢出bug。

*)修复反编译后Bug。

*)修改一些参数默认值。

*)修改一些类名、方法名。

*)等等(将持续更新升级)...

Mvc用法(服务器端):

public class HomeController : Controller
{
        public ActionResult Index()
        {
            //初始化Session,否则客户端不会生成ASP.NET_SessionId的Cookie,也将导致session直接丢失。
            HttpContext.Session.Add("test", "");
            return View();
        }
        public ActionResult CaptchaImage()
        {
            #region 一些测试设置
            var config = new CaptchaControl();
            //背景是否动态
            config.IsBackgroundDynamic = true;
            //验证码是否动态
            config.IsForegroundDynamic = true;
            config.Height = 50;
            config.Width = 150;
            //设置字体
            config.Fonts = new List<CaptchaFontArrayItem>()
            {
                new CaptchaFontArrayItem(new Font("Broadway",1)),
                new CaptchaFontArrayItem(new Font("Cooper Black",1))
            };
            //背景颜色
            config.BackColor = Color.Bisque;
            #endregion
            
            var h = new Captcha();
            var imageStream = new MemoryStream();
            string str = h.GenerateCaptchaImage(imageStream);
            h.ProcessRequest();
            return View();
        }
        public JsonResult Check(string Captcha)
        {
            try
            {
                var cc = new CaptchaControl();
                //HttpContext.Session[cc.SessionName] == null
                if (cc.CaptchaIsExpires())
                {
                    return Json("验证码session已失效!");
                }
                //HttpContext.Session[cc.SessionName].ToString().ToUpper() == Captcha.ToUpper()
                if (cc.CaptchaValidate(param.Captcha))
                {
                    return Json("验证码输入正确!");
                }
                return Json("验证码输入错误!正确值:" + HttpContext.Session[new CaptchaControl().SessionName] + "。您输入的值:" + Captcha);
            }
            catch (Exception ex)
            {
                return Json(ex.Message);
            }
        }
}

Mvc用法(前端):

<html>
<head>
    <title>Index</title>
    <script src="~/Scripts/jquery.min.js"></script>
</head>
<body>
<div>
    <input type="text" placeholder="请输入验证码" id="txtCaptcha"/> &nbsp;
    <img alt="点击图片更换验证码" title="点击图片更换验证码" src="/Home/CaptchaImage" onclick="this.src = '/Home/CaptchaImage?id=' + new Date().getTime()" style="cursor: pointer; -webkit-user-select: none">
    <p><input type="button" value="提交" onclick="Check()"/></p>
</div>
<script type="text/javascript">
    function Check() {
        $.post("/Home/Check", { Captcha: $("#txtCaptcha").val() }, function (result) {
            alert(result);
        });
    }
</script>
</body>
</html>

效果:

参数说明

1)         Width和Height:控件宽度和高度,这个值不仅决定了控件的尺寸,也决定了验证码字符的大小。当控件高度大于宽度时,验证码字符将纵向排列。
2)         ExpireTime:验证码的有效期,当超过这个时间后,即使用户的输入正确,也将无法通过验证(您亦可以自定义验证方法)。
3)         IsCaseSensive:是否大小写敏感,这个设置将对验证方式产生影响,同样,如果自定义验证方法,此设置项无效。
4)         AllowCharRotation:是否允许字符旋转,当此值为真时,产生的验证码字符会被做旋转形变。
5)         AllowDistortion:是否允许扭曲字符,当此值为真时,产生的验证码字符会被做扭曲形变。
6)         BackColor:控件背景色(注:可以设置为透明:“Transparent”,仅对非动态模式有效)。
7)         BorderColor:控件边框色。
8)         BorderStyle:控件边框样式,有直线、虚线等多种。
9)         BorderWidth:边框宽度。
10)     CharNum:字符数,即生成验证码的字符数量。
11)     CodeColorMode:验证码字符颜色填充模式:
l  “PURE_COLOR”模式:使用纯色填充,选中此项时将使用ForeColor项中设置的颜色为所有验证码字符填充颜色;
l “RANDOM_COLOR”模式:使用随机色填充每个验证码字符;
l “GRADIENT_COLOR”模式:使用随机渐变色整体填充验证码。
12)     CodeFontMode:验证码字符字体模式:
l “FONT_LIMITED”模式:验证码字符所使用的字体将从CodeFonts设置项所限定的字体集中随机选择,如果此项未设置,则使用系统默认字体;
l “FONT_FREE”模式:验证码字符所使用的字体将从系统内置的所有字体中随机选择(注:由于系统内置有图形符号字体,选择此项可能使生成的验证码图片包含不可辨认字符)。
13)     CodeFonts:验证码字符字体集,限定生成验证码字符所使用的字体,注意此设置项只有在CodeFontMode项设置为“FONT_LIMITED”时才有效。
14)     CodeFontSizeMode:验证码字符字号模式:
l “SIZE_FIXED”:固定字号模式,所有验证码字符均使用控件尺寸所允许的最大字号;
l “SIZE_VARY”:变化字号模式,每个验证码字符使用随机字号,最小字号为控件尺寸所允许的最大字号的3/5。
15)     CodeOpacity:验证码字符不透明度。
16)     ContentField:验证码字符的字符集:
l “DIGIT_ONLY”:纯数字模式:生成的验证码字符仅包含数字;
l “LETTER_ONLY”:纯字母模式:生成的验证码字符仅包含英文字母(大小写均有);
l “DIGIT_AND_LETTER”:数字、字母混合模式:生成的验证码字符包含数字和字母(注:不包含数字“1”和字母“l”以及数字“0”和字母“O”等容易混淆的字符);
l “CN_CHAR_ONLY”:中文模式:生成的验证码字符仅包含简体中文汉字;
l “JP_CHAE_ONLY”:日文模式:生成的验证码字符仅包含日语假名(平假名和片假名均有)。
(注意:选择后两者,要求网站运行的服务器安装有GB2312字符集,Windows中文操作系统默认已安装。)
17)     ForeColor:前景色,即验证码字符的颜色,此设置项仅在CodeColorMode项设置为“PURE_COLOR”时有效。
18)     IsBackgroundDynamic:背景是否为动态,此项值为真时,生成的验证码图片背景是动态的。
19)     IsForegroundDynamic:前景是否为动态,此项值为真时,生成的验证码图片前景(验证码字符)是动态的。
20)     NoiseMode:验证码图片噪化程度设置:
l HIGH_NOISY:高噪化度:生成的验证码图片包含前景线噪声、背景线噪声及背景点噪声;
l MIDDLE_NOISY:中等噪化度:生成的验证码图片包含背景线噪声及背景点噪声;
l LOW_NOISY:低噪化度:生成的验证码图片仅包含背景点噪声;
l NONE:生成的验证码图片未经噪化处理。
(注:噪化图像是为了防止机器识别验证码。如果验证码控件尺寸比较小,过高的噪化度可能给用户识别也带来困难。)
21)     TooTip:在页面中鼠标移过验证码图片时的提示信息,当获取验证码失败时也将显示此信息;
22)     LivePreview:开启或关闭验证码图片设计时预览,由于验证码图片是实时生成的,这可能在一定程度上影响页面的设计时性能(特别是当验证码图片尺寸比较大时),通过此设置项您可以选择开启或关闭设计时预览支持:
l ON:开启验证码图片设计时预览;
l OFF:关闭验证码图片设计时预览。

WebForm用法和以前一致。

未完待续...