ASP.NET图形验证码生成实践

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中生成图形验证码的实现方式,并介绍了如何在网页中展示和验证用户输入的图形验证码。通过生成随机的图形验证码,可以增强网站的安全性,避免机器识别用户密码等敏感信息,提高用户体验。

后端开发标签