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#连接Oracle数据库的连接字符串详解

    那么让我们开始“深入分析C#连接Oracle数据库的连接字符串详解”的完整攻略。 标题 深入分析C#连接Oracle数据库的连接字符串详解 简介 在使用C#编写与Oracle数据库交互的应用程序时,必须使用正确的连接字符串。本文旨在为读者提供一份易于理解的C#连接Oracle数据库的连接字符串详解,帮助读者加强对Oracle数据库连接字符串的理解。 步骤 步…

    C# 2023年6月1日
    00
  • ASP.NET 文件断点续传实现代码

    ASP.NET 文件断点续传是一种常用的文件上传方式,可以在上传过程中支持中断后恢复上传,从而提高了文件上传的可靠性和效率。下面我将为你详细讲解ASP.NET 文件断点续传实现的代码攻略: 1. 实现思路 实现文件断点续传的方法是通过客户端和服务器端相互配合来完成。当客户端需要上传一个文件时,首先将文件根据设定的分块大小分成若干个块,然后逐一上传到服务器端,…

    C# 2023年5月31日
    00
  • C# 使用HttpClient上传文件并附带其他参数的步骤

    针对这个问题,我将按照以下结构来详细讲解如何使用C#的HttpClient上传文件并附带其他参数: 上传文件的基本步骤 附带其他参数的上传步骤 示例1:上传文件并附带一个简单参数 示例2:上传多个文件并附带多个参数 1. 上传文件的基本步骤 要使用HttpClient上传文件,需要进行以下步骤: 创建一个实例的HttpClient类 构建一个实例的Multi…

    C# 2023年6月1日
    00
  • Winform开发框架中如何使用DevExpress的内置图标资源

    在Winform开发框架中使用DevExpress内置图标资源可以为我们的软件提供美观的界面效果和更好的用户体验。 下面是详细的攻略: 步骤一:添加DevExpress控件库 我们首先需要添加DevExpress控件库,可以通过在Visual Studio的工具箱中右键单击并选择“选项” -> “工具箱” -> “选择工具箱项” -> “D…

    C# 2023年6月3日
    00
  • C#多线程Singleton(单件)模式模板

    C#多线程Singleton(单件)模式模板是一种在多线程环境下保证对象只被创建一次并且可以被多线程共享的设计模式。下面我将提供一个完整的攻略来帮助大家了解如何在C#中实现多线程Singleton模式。 步骤一: 创建Singleton模板类 创建一个Singleton模板类,确保只有一个实例可以被创建。示例代码如下: public sealed class…

    C# 2023年5月31日
    00
  • Automapper实现自动映射的实例代码

    下面是关于“Automapper实现自动映射的实例代码”的攻略。 Automapper是什么? Automapper 是一款开源的 .NET 类库,用于对象自动映射。它可以通过提供源对象和目标对象的键值,将一个对象的属性值自动映射到另一个对象的相应属性上。使用 Automapper 可以减少手动复制属性的时间和工作量,简化代码的复杂度,并提高代码的可维护性。…

    C# 2023年6月3日
    00
  • C#类型转换之自定义隐式转换和显式转换

    C#中的类型转换包括隐式转换和显式转换。当两个类型可以隐式转换时,编译器会自动进行类型转换,而当需要进行显式转换时,则需要显示的指定类型转换操作。 自定义类型转换可以让我们在自定义类型(类)之间实现隐式转换和显式转换,这样就可以让代码更加简洁,可读性更高。 要定义一个自定义类型转换,需要在类型中定义两个方法:implicit和explicit。implici…

    C# 2023年5月15日
    00
  • 理解C#中的枚举(简明易懂)

    理解C#中的枚举(简明易懂) 在C#中,枚举是一种非常有效的机制来表示一组具有固定数量的离散值。本文将介绍在C#中使用枚举的概念、语法和示例。 概念 枚举是一个具有几个命名常量的数据类型。它是由相同类型的常量值组成的自定义数据类型。使用枚举可以增加代码的可读性,使代码更加容易维护和理解。 枚举的优点 使用枚举可以使代码更加自然。比如在我们日常生活中,一个星期…

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