C#生成简单验证码

我们平时无论是网站登录还是注册,都会频繁的遇到各式各样的验证码 ,其实生成验证码对于C#来说非常简单。

下面就是我学习生成验证码的简单实例。

封装的辅助类代码,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Drawing;
 4 using System.Drawing.Drawing2D;
 5 using System.Linq;
 6 using System.Security.Cryptography;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 
10 namespace Ninesky.Common
11 {
12     public class Security
13     {
14         /// <summary>
15         /// 创建验证码字符
16         /// 利用伪随机数生成器生成验证码字符串。
17         /// </summary>
18         /// <param name="length">字符长度</param>
19         /// <returns>验证码字符</returns>
20         public static string CreateVerificationText(int length)
21         {
22             char[] _verification = new char[length];
23             char[] _dictionary = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'
24 , 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'
25 , 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
26             Random _random = new Random();
27             for (int i = 0; i < length; i++)
28             {
29                 _verification[i] = _dictionary[_random.Next(_dictionary.Length - 1)];
30             }
31             return new string(_verification);
32         }
33         /// <summary>
34         /// 创建验证码图片
35         /// 思路是使用GDI+创建画布,使用伪随机数生成器生成渐变画刷,然后创建渐变文字。
36         /// </summary>
37         /// <param name="verificationText">验证码字符串</param>
38         /// <param name="width">图片宽度</param>
39         /// <param name="height">图片长度</param>
40         /// <returns>图片</returns>
41         public static Bitmap CreateVerificationImage(string verificationText, int width, int height)
42         {
43             Pen _pen = new Pen(Color.Black);
44             Font _font = new Font("Arial", 14, FontStyle.Bold);
45             Brush _brush = null;
46             Bitmap _bitmap = new Bitmap(width, height);
47             Graphics _g = Graphics.FromImage(_bitmap);
48             SizeF _totalSizeF = _g.MeasureString(verificationText, _font);
49             SizeF _curCharSizeF;
50             //PointF _startPointF = new PointF((width - _totalSizeF.Width) / 2, (height - _totalSizeF.Height) / 2);
51             PointF _startPointF = new PointF(0, (height - _totalSizeF.Height) / 2);
52             //随机数产生器
53             Random _random = new Random();
54             _g.Clear(Color.White);
55             for (int i = 0; i < verificationText.Length; i++)
56             {
57                 _brush = new LinearGradientBrush(new Point(0, 0), new Point(1, 1), Color.FromArgb(_random.Next(255), _random.Next(255), _random.Next(255)), Color.FromArgb(_random.Next(255), _random.Next(255), _random.Next(255)));
58                 _g.DrawString(verificationText[i].ToString(), _font, _brush, _startPointF);
59                 _curCharSizeF = _g.MeasureString(verificationText[i].ToString(), _font);
60                 _startPointF.X += _curCharSizeF.Width;
61             }
62             _g.Dispose();
63             return _bitmap;
64         }
65         /// <summary>
66         /// 256位散列加密
67         /// </summary>
68         /// <param name="plainText">明文</param>
69         /// <returns>密文</returns>
70         public static string Sha256(string plainText)
71         {
72             SHA256Managed _sha256 = new SHA256Managed();
73             byte[] _cipherText = _sha256.ComputeHash(Encoding.Default.GetBytes(plainText));
74             return Convert.ToBase64String(_cipherText);
75         }
76     }
77 }
Security

 后台控制器代码,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Drawing;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 using Ninesky.Common;
 8 
 9 namespace WebTest.Controllers
10 {
11     public class VerificationCodeController : Controller
12     {
13         List<string> userlist = new List<string>();
14         //
15         // GET: /VerificationCode/
16 
17         public ActionResult Index()
18         {
19             ViewData["VerificationCode"] = TempData["VerificationCode"];
20             return View();
21         }
22         /// <summary>
23         /// 验证码
24         /// </summary>
25         /// <returns></returns>
26         public ActionResult VerificationCode()
27         {
28             string verificationCode = Security.CreateVerificationText(6);
29             Bitmap _img = Security.CreateVerificationImage(verificationCode, 140, 30);
30             _img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
31             TempData["VerificationCode"] = verificationCode.ToUpper();
32             return null;
33         }
34 
35         public string Register(FormCollection coll)
36         {
37             string AccountNumber = coll["AccountNumber"].Trim().ToString();
38             string Password = coll["Password"].Trim().ToString();
39             string ConfirmPassword = coll["ConfirmPassword"].Trim().ToString();
40             string verificationcode = coll["verificationcode"].Trim().ToString().ToUpper();
41             if (string.IsNullOrEmpty(AccountNumber))
42             {
43                 return "用户名称不能为空!";
44             }
45             else if (userlist.Count > 0 && userlist.Where(m => m == AccountNumber).First() != null)
46             {
47                 return "该用户已存在!";
48             }
49             else if (!Password.Equals(ConfirmPassword))
50             {
51                 return "两次输入密码不一致!";
52             }
53             else if (!verificationcode.Equals(TempData["VerificationCode"].ToString()))
54             {
55                 return "验证码输入错误!";
56             }
57             else
58             {
59                 userlist.Add(AccountNumber);
60                 return "恭喜你,注册成功!";
61             }
62         }
63     }
64 }
VerificationCodeController

 前台页面代码,如下:

  1 @{
  2     ViewBag.Title = "注册页面";
  3 }
  4 <script src="~/Scripts/jquery-3.1.1.min.js"></script>
  5 <style type="text/css">
  6     .txt
  7     {
  8         height: 30px;
  9     }
 10 
 11     .td td
 12     {
 13         max-height: 15px;
 14         padding: 0px;
 15         margin: 0px;
 16     }
 17 
 18     .img
 19     {
 20         padding: 0px;
 21         margin: 0px;
 22     }
 23 </style>
 24 <script type="text/javascript">
 25     $(function () {
 26         $("#Agreest").change(function () {
 27             if ($("#Agreest").checked) {
 28                 $("#btnRegister").attr({ "disabled": "disabled" });
 29                 //$("#btnRegister").attr("disabled", true);
 30             } else {
 31                 $("#btnRegister").removeAttr("disabled");
 32                 //$("#btnRegister").attr("disabled", false);
 33             }
 34         })
 35         $("#btnRegister").click(function () {
 36             if ($("#Agreest").checked == false) {
 37                 alert("请认真阅读用户注册协议!");
 38                 return;
 39             }
 40             var vc = $("#verificationcode").val();
 41             $.ajax({
 42                 type: "POST",
 43                 url: "/VerificationCode/Register",
 44                 data: $("#FormRegister").serialize(),
 45                 success: function (data) {
 46                     alert(data);
 47                     $("#verificationcodeimg").attr("src", "@Url.Action("VerificationCode")?" + new Date());
 48                 }
 49             });
 50         });
 51         $("#verificationcodeimg").click(function () {
 52             $("#verificationcodeimg").attr("src", "@Url.Action("VerificationCode")?" + new Date());
 53         });
 54     });
 55 
 56 </script>
 57 <form action="/VerificationCode/Register" method="post" id="FormRegister">
 58     <table class="td">
 59         <tr>
 60             <td></td>
 61             <td>用户注册</td>
 62             <td></td>
 63         </tr>
 64         <tr>
 65             <td>账号:</td>
 66             <td>
 67                 <input type="text" class="txt" value="" name="AccountNumber" id="AccountNumber">
 68             </td>
 69             <td></td>
 70         </tr>
 71         <tr>
 72             <td>密码:</td>
 73             <td>
 74                 <input type="text" class="txt" value="" name="Password" id="Password">
 75             </td>
 76             <td></td>
 77         </tr>
 78         <tr>
 79             <td>确认密码:</td>
 80             <td>
 81                 <input type="text" class="txt" value="" name="ConfirmPassword" id="ConfirmPassword">
 82             </td>
 83             <td></td>
 84         </tr>
 85         <tr>
 86             <td>验证码:</td>
 87             <td>
 88                 <input type="text" class="txt" value="" name="verificationcode" id="verificationcode">
 89             </td>
 90             <td>
 91                 <img id="verificationcodeimg" class="img" title = "点击刷新" src = "@Url.Action("VerificationCode")" style="cursor:pointer"/></td>
 92         </tr>
 93         <tr>
 94             <td colspan="2">
 95                 <input id="Agreest" type="checkbox" checked="checked" />我同意<a href="#">《用户注册协议》</a>
 96             </td>
 97             <td></td>
 98         </tr>
 99         <tr>
100             <td></td>
101             <td>
102                 <input type="button" value="注册" id="btnRegister" class="btn" />
103             </td>
104             <td></td>
105         </tr>
106     </table>
107 </form>
Index

 实例效果图,如下:

posted @ 2017-02-22 17:04  长毛象  阅读(516)  评论(0编辑  收藏  举报
Top
微信关注我的公众号