ASP.NET图形验证码生成实践
1. 概述
图形验证码(Captcha)是一种常见的用户身份验证方式,通过生成随机的图形验证码,要求用户输入正确的文本内容以验证其身份。本文将介绍ASP.NET中生成图形验证码的实现方式。
2. 生成图形验证码
2.1 添加命名空间
首先,我们需要在代码文件中添加下面一行代码,以使用生成图形验证码所需的命名空间:
using System.Drawing.Imaging;
2.2 生成验证码图片
通过以下代码可以生成一个包含随机字符串的验证码图片:
string randomString = GenerateRandomString(6);
Bitmap image = GenerateImage(randomString);
GenerateRandomString函数用于生成指定长度的随机字符串,代码如下:
private string GenerateRandomString(int length)
{
Random random = new Random();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
该函数通过获取指定长度的字符集中的随机字符,重复指定次数来生成随机字符串。
GenerateImage函数用于将生成的随机字符串绘制到图片上,代码如下:
private Bitmap GenerateImage(string randomString)
{
Random random = new Random();
int width = 150;
int height = 50;
Font font = new Font("Arial", 24, FontStyle.Bold);
Brush brush = new SolidBrush(Color.Black);
Bitmap image = new Bitmap(width, height);
Graphics graphics = Graphics.FromImage(image);
graphics.Clear(Color.White);
graphics.DrawString(randomString, font, brush, 20, 10);
for (int i = 0; i < 50; i++)
{
int x1 = random.Next(0, width);
int x2 = random.Next(0, width);
int y1 = random.Next(0, height);
int y2 = random.Next(0, height);
graphics.DrawLine(new Pen(Color.LightGray), x1, y1, x2, y2);
}
return image;
}
该函数通过指定图片宽度和高度、字体、笔刷等参数绘制一个指定字符串的图片,并在图片上添加一些随机的曲线、线段等元素,使得生成的图形验证码更加难以被机器识别。
2.3 保存验证码图片
最后,我们需要将生成的验证码图片保存到后台,以便后续验证用户输入的文本内容是否与生成的随机字符串相同。以下是保存图片的代码:
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Png);
byte[] bytes = stream.ToArray();
Session["CaptchaImage"] = bytes;
该代码将生成的图形验证码以PNG格式保存到一个内存流中,并将流转换为字节数组,最后将字节数组保存到ASP.NET会话中,以便之后比较用户输入的文本内容。
3. 使用图形验证码
3.1 展示图形验证码
展示图形验证码的代码如下:
该代码将请求一个名称为CaptchaImage.ashx的HTTP处理程序,并通过该处理程序返回上一步保存在会话中的图形验证码。下面是CaptchaImage.ashx的实现代码:
public class CaptchaImage : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
byte[] bytes = (byte[])context.Session["CaptchaImage"];
context.Response.ContentType = "image/png";
context.Response.BinaryWrite(bytes);
}
public bool IsReusable
{
get
{
return true;
}
}
}
该代码实现了IHttpHandler接口,处理请求并返回保存在会话中的图形验证码以PNG格式。
3.2 验证用户输入
当用户提交表单时,我们需要获取用户输入的文本内容,并验证其是否与生成的随机字符串相同。以下是验证用户输入的代码:
string userCaptcha = Request.Form["CaptchaTextBox"];
string captcha = (string)Session["Captcha"];
if (userCaptcha == captcha)
{
// 用户输入正确
}
else
{
// 用户输入错误
}
该代码首先获取用户在文本框中输入的内容,然后从会话中获取之前生成的随机字符串,最后比较两者是否相同,以判断用户输入是否正确。
4. 总结
本文演示了ASP.NET中生成图形验证码的实现方式,并介绍了如何在网页中展示和验证用户输入的图形验证码。通过生成随机的图形验证码,可以增强网站的安全性,避免机器识别用户密码等敏感信息,提高用户体验。