基于ASP.NET实现验证码生成详解

下面我会详细讲解“基于ASP.NET实现验证码生成”的完整攻略。

什么是验证码(CAPTCHA)?

验证码(CAPTCHA),全称为 Completely Automated Public Turing test to tell Computers and Humans Apart,是一种用于区分计算机和人类的测试。一般用于抵御自动化的恶意攻击和垃圾信息。常见的验证码包括图像、声音、文字等形式。

用ASP.NET如何生成简单图形验证码?

在ASP.NET中,我们可以使用System.Drawing命名空间提供的Graphics类和Bitmap类,创建一个简单的图形验证码。下面是一个简单的ASP.NET页面,用于生成一个包含四位随机字符的图形验证码。

<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        string captcha = RandomString(4);
        this.Session["captcha"] = captcha; //将验证码存入Session中,以便后续验证
        DrawImage(captcha);
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
        //清除缓存
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetNoStore();
    }

    //生成随机字符
    private string RandomString(int n)
    {
        string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random rd = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++)
        {
            sb.Append(chars[rd.Next(chars.Length)]);
        }
        return sb.ToString();
    }

    //绘制图像
    private void DrawImage(string text)
    {
        Bitmap bmp = new Bitmap(100, 40);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
        Font font = new Font("Arial", 24);
        Brush brush = new SolidBrush(Color.Black);
        g.DrawString(text, font, brush, 10, 5);
        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Png);
        Response.ContentType = "image/png";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        bmp.Dispose();
    }
</script>

该页面的代码逻辑很简单,首先在Page_Load事件中生成一个包含四位随机字符的字符串,并将其存入Session中以便后续验证。然后利用Graphics类和Bitmap类绘制一个包含随机字符的图像,并将该图像以PNG格式输出给浏览器显示。同时,我们还在Page_Unload事件中清空缓存。

用ASP.NET如何实现基于字符的验证码?

基于字符的验证码,一般是将随机生成的字符绘制在图像上,并添加一些干扰线、干扰点等辅助图形,以增强验证码的识别难度。下面是一个基于字符的验证码生成示例代码。

<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        string captcha = RandomString(4);
        this.Session["captcha"] = captcha;
        DrawImage(captcha);
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetNoStore();
    }

    private string RandomString(int n)
    {
        string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random rd = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++)
        {
            sb.Append(chars[rd.Next(chars.Length)]);
        }
        return sb.ToString();
    }

    private void DrawImage(string text)
    {
        Bitmap bmp = new Bitmap(120, 50);
        Graphics g = Graphics.FromImage(bmp);
        g.Clear(Color.White);//清除画面,填充背景色

        Random rd = new Random(Guid.NewGuid().GetHashCode());//随机数产生器
        int randAngle = rd.Next(-45, 45);//随机转动角度
        float x = -18;
        float y = 0;
        for (int i = 0; i < text.Length; i++)
        {
            //绘制字符
            Font font = new Font("Arial", 30 + rd.Next(3), FontStyle.Bold);
            Brush brush = new SolidBrush(Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
            g.RotateTransform(randAngle);//对字符进行角度旋转或倾斜
            g.DrawString(text[i].ToString(), font, brush, x + (i * 30), y);
            g.RotateTransform(-randAngle);//对字符进行反向旋转或倾斜

            //绘制干扰线
            Pen pen = new Pen(Color.Silver, 2);
            int x1 = rd.Next(bmp.Width);
            int y1 = rd.Next(bmp.Height);
            int x2 = rd.Next(bmp.Width);
            int y2 = rd.Next(bmp.Height);
            g.DrawLine(pen, x1, y1, x2, y2);

            //绘制干扰点
            pen = new Pen(Color.Gray, 2);
            for (int j = 0; j < 50; j++)
            {
                int x0 = rd.Next(bmp.Width);
                int y0 = rd.Next(bmp.Height);
                bmp.SetPixel(x0, y0, Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
            }
        }

        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Png);
        Response.ContentType = "image/png";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        bmp.Dispose();
    }
</script>

该页面的代码逻辑比较复杂,主要分为以下三个部分:

1.生成随机字符串:利用Random类产生指定长度的随机字符串。

2.生成验证码图片:使用Graphics类和Bitmap类绘制验证码图片。该过程主要可以分为绘制字符和绘制干扰线、干扰点两个部分。

3.输出验证码图片:利用Response对象将验证码图片输出到浏览器。

以上就是“基于ASP.NET实现验证码生成”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ASP.NET实现验证码生成详解 - Python技术站

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

相关文章

  • C#在Winform开发中使用Grid++报表

    C#是一种流行的编程语言,可以用于Windows窗体开发。在Winform开发中,Grid++报表是一种流行的报表生成工具,可以方便地生成各种报表。下面是详细的攻略: 准备工作 在使用Grid++报表前,需要先下载并安装Grid++ Report软件。安装完成后,需要将Grid++ Report的.NET程序集引入到项目中,以便使用Grid++ Report…

    C# 2023年6月1日
    00
  • .NET Core部署为Windows服务的详细步骤

    以下是.NET Core部署为Windows服务的详细步骤: 1. 什么是Windows服务 Windows服务是一种在后台运行的,它可以在Windows操作系统启动时自动启动,并在系统运行时一直运行。Windows服务通常用于执行后台任务,例如监视文件夹、处理消息队列等。 2. 什么是.NET Core .NET Core是微软的一个跨平台开发框架,它支持…

    C# 2023年5月12日
    00
  • NetCore WebSocket即时通讯示例

    NetCore WebSocket即时通讯示例是一种使用ASP.NET Core SignalR实现WebSocket即时通讯的方法。本文将详细讲解NetCore WebSocket即时通讯示例的实现过程,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始实现NetCore WebSocket即时通讯示例之前,我们需要先搭建好开发环境。具体来说,我们需要…

    C# 2023年5月16日
    00
  • 【开源游戏】Legends-Of-Heroes 基于ET 7.2的双端C#(.net7 + Unity3d)多人在线英雄联盟风格的球球大作战游戏。

    Legends-Of-Heroes 一个LOL风格的球球大作战游戏,基于ET7.2,使用状态同步  Main 基于C#双端框架[ET7.2],同步到ET主干详情请看日志。(https://github.com/egametang/ET) 注意:已经升级.Net7,请安装.Net7 SDK. 此游戏为ET7.2的一个实践项目demo,玩法主要是球球大作战类型的…

    C# 2023年5月9日
    00
  • C#中is,as,using关键字的使用说明

    当使用C#编写程序时,is,as以及using是经常用到的关键字。下面将分别介绍它们的使用说明。 is is关键字用于判断一个对象是否是某个类或其派生类的实例。 示例1:判断一个对象是否是List类的实例。 List<int> list = new List<int>(); if (list is List<int>) {…

    C# 2023年5月15日
    00
  • C#正则表达式Regex类的用法

    C#正则表达式(Regex)是一个用来匹配字符串模式的工具,它可以比较方便地用于处理文本、验证输入数据、提取数据等。在C#中,有一个表示正则表达式的Regex类,它提供了许多方法可以用来处理文本。下面我们一起来详细讲解C#正则表达式Regex类的用法。 正则表达式的基本语法 在使用C#正则表达式Regex类之前,我们需要先学习一些正则表达式的基本语法。下面是…

    C# 2023年6月7日
    00
  • c#继承与多态使用示例

    我可以为您解释下“C#继承与多态使用示例”的完整攻略。 标题 标题是标识文章主题的必要元素,我们可以通过#符号来对标题进行标注,例如: # C#继承与多态使用示例 继承 在 C# 中,类可以通过继承从另一个类中获得其成员。继承的语法为: class SubClass : SuperClass { //子类成员 } 在此示例中,SubClass 会从 Supe…

    C# 2023年6月1日
    00
  • .Net Core 集成 Kafka的步骤

    在本攻略中,我们将详细讲解如何在.Net Core中集成Kafka,并提供两个示例说明。 安装Kafka:首先,我们需要安装Kafka。我们可以从官方网站下载Kafka,并按照官方文档进行安装和配置。 安装Confluent.Kafka:接下来,我们需要安装Confluent.Kafka NuGet包。我们可以使用Visual Studio的NuGet包管理…

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