asp.net 简单验证码验证实现代码

下面是 “asp.net 简单验证码验证实现代码”的完整攻略:

标题

1. 引入命名空间

使用验证码,需要在代码中引入System.Drawing和System.Drawing.Imaging两个命名空间。在aspx页面的头部引入这两个命名空间即可。

<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>

2. 编写验证码生成函数

public void CreateCheckCodeImage(int codeCount, int width, int height, Stream outputStream)
{
    int fontSize = Math.Min(width / (codeCount + 1), height - 5); // 计算字体大小
    Bitmap bmp = new Bitmap(width, height); // 创建画布

    Graphics g = Graphics.FromImage(bmp); // 创建画布上下文
    g.Clear(Color.White); // 填充画布背景色
    g.SmoothingMode = SmoothingMode.HighQuality; // 设置抗锯齿

    Random random = new Random(); // 创建随机数生成器

    //生成干扰线条
    for (int i = 0; i < 10; i++)
    {
        int x1 = random.Next(width);
        int y1 = random.Next(height);
        int x2 = random.Next(width);
        int y2 = random.Next(height);
        g.DrawLine(new Pen(Color.LightGray, 1), x1, y1, x2, y2);
    }

    string checkCode = string.Empty; // 保存验证码字符串

    // 依次绘制每个字符
    for (int i = 0; i < codeCount; i++)
    {
        // 生成一个随机数字或字母
        int num = random.Next(36);
        char code;
        if (num < 10)
        {
            code = (char)('0' + num);
        }
        else
        {
            code = (char)('A' + num - 10);
        }
        checkCode += code.ToString(); //保存验证码字符

        //随机生成字符的加粗、倾斜以及旋转角度等效果
        float skewX = random.Next(0, 60) / 10f - 3f;
        float skewY = random.Next(0, 40) / 10f - 2f;
        float angle = random.Next(-10, 10);
        // 计算字符绘制位置
        PointF point = new PointF(fontSize * (i + 1) + random.Next(-2, 2), height / 2 + random.Next(-5, 5));
        // 设置字符颜色
        Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
        using (Font font = new Font(FontFamily.GenericSerif, fontSize, FontStyle.Bold))
        using (Matrix mat = new Matrix(1, 0, 0, 1, 0, 0))
        {
            mat.Shear(skewX, skewY); //  设置剪切
            mat.Rotate(angle); //  设置旋转角度
            g.Transform = mat; // 应用变换矩阵
            g.DrawString(code.ToString(), font, new SolidBrush(color), point); // 绘制字符
            g.ResetTransform(); // 恢复矩阵
        }
    }

    bmp.Save(outputStream, ImageFormat.Jpeg); // 输出图像
    context.Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
    g.Dispose(); // 释放资源
    bmp.Dispose();
}

3. 在页面上使用

在需要验证码的页面创建一个“image”标签,在后台动态生成验证码并输出到该标签,同时将验证码字符串保存到会话中。

<asp:Image ID="imgCheckCode" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
    MemoryStream ms = new MemoryStream(); //创建内存流
    CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
    byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
    Response.ClearContent(); // 清空输出流
    Response.ContentType = "image/Jpeg"; //设置输出类型
    Response.BinaryWrite(buffer); //输出图像
    Response.End(); //停止输出
}

4. 验证用户输入

将用户输入的验证码字符串和之前保存在会话中的验证码字符串进行比较即可。

string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
{
    //验证码错误
}
else
{
    //验证码正确
}

示例说明

示例一

在登录页面中添加验证码,实现防止恶意攻击的效果。

<asp:TextBox ID="txtName" runat="server" />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" />
<asp:TextBox ID="txtCheckCode" runat="server" />
<asp:Image ID="imgCheckCode" runat="server" />
<asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />

在后台页面中生成验证码,并将验证码字符串和用户输入进行比较验证:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        MemoryStream ms = new MemoryStream(); //创建内存流
        CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
        byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
        imgCheckCode.ImageUrl = "data:image/Jpeg;base64," + Convert.ToBase64String(buffer); //输出图像
        Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
    }
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
    if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
    {
        //验证码错误
        Response.Write("验证码错误");
    }
    else
    {
        //验证码正确,进行登录操作
        //...
    }
}

示例二

创建一个注册页面,在其中添加验证码,并将验证码的结果保存到数据库中。

<asp:TextBox ID="txtName" runat="server" />
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password" />
<asp:TextBox ID="txtCheckCode" runat="server" />
<asp:Image ID="imgCheckCode" runat="server" />
<asp:Button ID="btnRegister" runat="server" Text="注册" OnClick="btnRegister_Click" />

在后台页面中生成验证码,并将验证码字符串和用户输入进行比较验证,如果验证通过,则将用户名、密码和验证码字符串保存到数据库中。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        MemoryStream ms = new MemoryStream(); //创建内存流
        CreateCheckCodeImage(4, 100, 50, ms); //生成验证码
        byte[] buffer = ms.ToArray(); //从内存流中获取字节数组
        imgCheckCode.ImageUrl = "data:image/Jpeg;base64," + Convert.ToBase64String(buffer); //输出图像
        Session["CheckCode"] = checkCode; // 将验证码字符串保存到会话中
    }
}

protected void btnRegister_Click(object sender, EventArgs e)
{
    string checkCode = Session["CheckCode"].ToString(); //获取会话中保存的验证码字符串
    if (!string.Equals(txtCheckCode.Text.Trim(), checkCode, StringComparison.InvariantCultureIgnoreCase))
    {
        //验证码错误
        Response.Write("验证码错误");
    }
    else
    {
        //验证码正确,将用户输入保存到数据库中
        string name = txtName.Text.Trim();
        string password = txtPassword.Text.Trim();
        //保存到数据库中
        //...
        Response.Write("注册成功");
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net 简单验证码验证实现代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#特性(Attribute)

    C#中的特性(Attribute)可以为代码添加元数据信息,这些元数据存储在程序集、类、方法、字段或者属性等级别上,可以在程序运行的时候被读取和使用。在本文中,将详细讲解C#中的特性,包括特性的定义、使用方法以及示例说明。 定义特性 在C#中,特性是一种自定义类型,它必须继承自System.Attribute类。定义一个特性,需要在类的声明上使用[ ]括起来…

    C# 2023年5月31日
    00
  • C#基础:Equals()与运算符==的区别分析

    标题:C#基础:Equals()与运算符==的区别分析 简介 在C#编程中,我们经常需要比较两个对象的值是否相等,比如比较两个字符串或数值是否相等等。而比较对象值相等的方式有很多种,比如使用Equals()方法或运算符==。本文将深入分析Equals()方法与运算符==的区别,并提供几个示例来帮助解释。 Equals()方法与运算符==的区别 我们先来简单地…

    C# 2023年6月1日
    00
  • .net后台代码调用前台JS的两种方式

    你可以按照以下步骤来进行。 步骤一:引入前端JS文件 在实现后台调用前台JS的功能之前,首先需要在HTML页面引入JS文件。我们可以使用以下代码引入JS文件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo…

    C# 2023年5月31日
    00
  • C#9.0推出的4个新特性介绍

    下面会详细解释C# 9.0推出的4个新特性。 1. 初始化设置 初始化设置是指在声明变量时就对其进行初始化的语法糖。在C# 9.0之前,如果需要在创建类实例时初始化一些属性,需要写出完整的构造函数并在代码中进行调用。而在C# 9.0中,我们可以通过以下语法糖来完成同样的操作: var person = new Person { FirstName = &qu…

    C# 2023年5月31日
    00
  • Unity3D使用右键菜单打开工程

    使用右键菜单打开Unity3D工程是一种非常方便的方式,能够节省我们在寻找项目文件夹的时间。在下面的攻略中,我们将详细讲解如何使用右键菜单打开Unity3D工程。 步骤一:创建.reg文件 首先,在您的桌面或其他位置创建一个新的文本文件。为了方便,我们可以将其命名为“Open with Unity.reg”。 然后,将下面的代码粘贴到新建的文本文件中: Wi…

    C# 2023年6月3日
    00
  • Android实现横屏切换科学计算器

    Android实现横屏切换科学计算器攻略 介绍 在Android应用中实现横屏切换,能够提升用户体验,特别是在进行科学计算的时候。在横屏模式下,可以修改应用的布局,增加更多的控件和功能。本文将详细讲解如何实现在Android应用中实现横屏切换的科学计算器。 实现步骤 首先需要定义两种不同的布局文件,一种布局用于竖屏模式,另一种用于横屏模式。命名方式应该为: …

    C# 2023年6月7日
    00
  • 使用C#在注册表中保存信息的例子

    在C#中,可以使用Microsoft.Win32命名空间中的Registry类来访问系统注册表。下面是使用C#在注册表中保存信息的攻略。 1. 创建注册表项 在注册表中保存信息之前,需要先创建一个注册表项。可以使用RegistryKey类的CreateSubKey方法来创建一个新的子项。以下示例代码创建名为“myapp”的注册表项: using Micros…

    C# 2023年6月7日
    00
  • C#使用Selenium+PhantomJS抓取数据

    我会为您提供一份详细的攻略。 1. 准备工作 如果您需要使用C#编写程序来使用Selenium和PhantomJS抓取网页数据,那么您需要先准备以下几个工具和组件: Visual Studio:C#开发环境 Selenium WebDriver:Selenium C#库 PhantomJS:无头浏览器 2. 安装和设置Selenium和PhantomJS 安…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部