ASP.net 验证码实现代码(C#)

ASP.NET 验证码实现代码(C#)攻略

前言

验证码是一种常用的安全验证手段,用于防止恶意机器人注册、登录、提交表单等操作。本篇文章将介绍如何在ASP.NET中使用C#实现验证码功能。

实现过程

1. 生成随机字符串

首先,我们需要生成一串随机字符串,作为验证码。可以使用Random类和StringBuilder类来生成:

Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++)
{
    int code = random.Next(65, 91); // Generate the verification code with the ASCII value of A to Z
    sb.Append((char)code); // Convert the ASCII code to character and append it to the StringBuilder
}
string verCode = sb.ToString();

2. 将验证码存入Session

生成验证码之后,我们需要将其存储在Session中,以便于后面的验证。可以使用如下代码:

Session["VerificationCode"] = verCode;

3. 绘制验证码图片

接下来,我们需要将验证码绘制成一张图片。可以使用GDI+绘图库,将随机字符串绘制在一张空白图片上。代码如下所示:

Bitmap bitmap = new Bitmap(100, 30); // Create an empty image with the width of 100 and the height of 30
Graphics graphics = Graphics.FromImage(bitmap); // Get the graphics object of the image
// Set the font and color of the string to be drawn
Font font = new Font("Arial", 18, FontStyle.Bold);
SolidBrush brush = new SolidBrush(Color.Black);
graphics.DrawString(verCode, font, brush, 10, 5); // Draw the string on the image

4. 输出图片

最后一步是将生成的验证码图片输出到客户端。可以将图片以二进制形式输出,如下所示:

MemoryStream ms = new MemoryStream(); // Create a memory stream to store the image
bitmap.Save(ms, ImageFormat.Jpeg); // Save the image to the memory stream in JPEG format
Response.ClearContent(); // Clear the response buffer
Response.ContentType = "image/Jpeg"; // Set the content type of the response to image/Jpeg
Response.BinaryWrite(ms.ToArray()); // Write the image to the response

示例说明

示例1: 在ASP.NET网页中使用验证码

在ASP.NET网页中使用验证码,可以防止机器人恶意注册或登录。下面是一个简单的示例,展示如何在ASP.NET网页中使用上述代码实现验证码功能:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GenerateVerificationCode(); // Generate a verification code when the page first loads
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (txtVerificationCode.Text.Trim().Equals(Session["VerificationCode"].ToString(), StringComparison.OrdinalIgnoreCase))
    {
        // Verification succeeded, do something...
    }
    else
    {
        // Verification failed, do something...
        GenerateVerificationCode(); // Generate a new verification code and refresh the image
    }
}

private void GenerateVerificationCode()
{
    Random random = new Random();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 4; i++)
    {
        int code = random.Next(65, 91); // Generate the verification code with the ASCII value of A to Z
        sb.Append((char)code); // Convert the ASCII code to character and append it to the StringBuilder
    }
    string verCode = sb.ToString();
    Session["VerificationCode"] = verCode;

    Bitmap bitmap = new Bitmap(100, 30); // Create an empty image with the width of 100 and the height of 30
    Graphics graphics = Graphics.FromImage(bitmap); // Get the graphics object of the image
    Font font = new Font("Arial", 18, FontStyle.Bold); // Set the font and color of the string to be drawn
    SolidBrush brush = new SolidBrush(Color.Black);
    graphics.DrawString(verCode, font, brush, 10, 5); // Draw the string on the image

    MemoryStream ms = new MemoryStream(); // Create a memory stream to store the image
    bitmap.Save(ms, ImageFormat.Jpeg); // Save the image to the memory stream in JPEG format
    Response.ClearContent(); // Clear the response buffer
    Response.ContentType = "image/Jpeg"; // Set the content type of the response to image/Jpeg
    Response.BinaryWrite(ms.ToArray()); // Write the image to the response
    graphics.Dispose(); // Dispose the graphics object
    bitmap.Dispose(); // Dispose the bitmap object
}

示例2: 将验证码封装为ASP.NET自定义控件

将验证码封装为ASP.NET自定义控件,可以将其易于重用,并且可以更加方便地设置外观和行为。下面是一个简单的示例,展示如何将验证码封装为ASP.NET自定义控件:

public class VerificationCodeControl : WebControl, INamingContainer
{
    private string _verCode;

    [DefaultValue(4)]
    public int Length { get; set; } = 4;

    public string FontFamily { get; set; } = "Arial";

    public int FontSize { get; set; } = 18;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        GenerateVerificationCode(); // Generate a verification code when the control is initialized
        this.Attributes["src"] = this.Page.ResolveUrl("~/VerificationCode.ashx"); // Set the source of the image to the ASHX handler
    }

    private void GenerateVerificationCode()
    {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < Length; i++)
        {
            int code = random.Next(65, 91); // Generate the verification code with the ASCII value of A to Z
            sb.Append((char)code); // Convert the ASCII code to character and append it to the StringBuilder
        }
        _verCode = sb.ToString();
        this.Page.Session["VerificationCode"] = _verCode;
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Alt, "Verification Code");
        writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass);
        writer.AddAttribute(HtmlTextWriterAttribute.Style, $"font-family: {FontFamily}; font-size: {FontSize}px;");
        base.AddAttributesToRender(writer);
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.Write(_verCode); // Render the verification code as plain text (fallback for non-HTML5 browser)
        base.RenderContents(writer);
    }
}

上述代码会生成一个继承自WebControl的VerificationCodeControl控件,可以在ASP.NET网页中方便地使用。比如,可以在ASPX页面中使用以下代码:

<%@ Register TagPrefix="Custom" Namespace="MyNamespace" %>
<Custom:VerificationCodeControl ID="VerificationCode1" runat="server" Length="6" FontSize="30" />

这里演示的是如何将生成验证码的逻辑封装为自定义控件,并且使用ASHX处理程序来输出验证码图片。稍微修改一下ASHX处理程序即可。

结语

本文介绍了如何使用C#在ASP.NET中实现验证码功能,并且提供了两个简单的示例。通过使用验证码,可以提高网站的安全性和可靠性,避免恶意机器人、蜘蛛等程序对网站造成的风险和威胁。

参考资料

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

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

相关文章

  • asp实现二进制字符串转换为Unicode字符串

    实现二进制字符串转换为Unicode字符串,可以通过以下步骤来完成: 将二进制字符串转换为byte数组。可以通过将二进制字符串每8位作为一个byte元素,将这些byte元素组成一个byte数组,来实现二进制字符串转换为byte数组。 示例1: 假设有以下二进制字符串:01100001011100100111001101110100 按照每8位作为一个byte…

    C# 2023年6月7日
    00
  • C#中类的使用教程详解

    C#中类的使用教程详解 什么是类 在C#中,类是一种自定义类型,它允许我们定义自己的数据类型以及与它相关的方法和事件。类包含了多个成员,包括属性、方法、字段、构造函数和事件等。使用类,我们可以把数据和相应的方法封装在一起,便于代码的管理和维护。 声明和定义类 定义一个类的语法格式如下: [修饰符] class 类名 { //类成员 } 其中,修饰符是可选部分…

    C# 2023年6月1日
    00
  • ckeditor syntaxhighlighter代码高亮插件配置分享

    下面是详细的“ckeditor syntaxhighlighter代码高亮插件配置分享”的攻略: 1. 安装 SyntaxHighlighter 插件 首先,我们需要在我们的网站上安装 SyntaxHighlighter 插件。我们可以从其官方网站(http://alexgorbatchev.com),或者从 Github 上(https://github.…

    C# 2023年6月6日
    00
  • 关于C#操作文件路径(Directory)的常用静态方法详解

    关于C#操作文件路径(Directory)的常用静态方法详解 Directory类的简介 在C#中,Directory类提供了用于操作文件夹和文件路径的静态方法。它通过一系列的静态方法,可以实现对于文件夹以及文件路径的各种操作。常用的静态方法有以下几种: Directory.Exists(string path):判断某个路径是否存在 Directory.C…

    C# 2023年5月15日
    00
  • C#使用Interlocked实现线程同步

    C#使用Interlocked实现线程同步 什么是Interlocked Interlocked是C#中用于实现线程同步的一组原子操作。原子操作是不可分割的,会形成一个不可分割的操作单元。Interlocked操作在执行过程中不需要使用锁,而是使用硬件支持的原子操作指令,对数据进行读取、计算和写入,保证操作的原子性。 Interlocked常用的方法 C#中…

    C# 2023年6月7日
    00
  • C#利用win32 Api 修改本地系统时间、获取硬盘序列号

    修改本地系统时间 首先需要导入System.Runtime.InteropServices这个命名空间. using System.Runtime.InteropServices; 然后我们通过GetSystemTime方法获取系统时间,再通过SetSystemTime方法修改系统时间. [DllImport("Kernel32.dll"…

    C# 2023年6月1日
    00
  • ASP.NET Core 6最小API中使用日志和DI示例详解

    ASP.NET Core 6最小API中使用日志和DI示例详解 在ASP.NET Core 6中,最小API是一种轻量级的方式来构建Web API。在本攻略中,我们将介绍如何在ASP.NET Core 6最小API中使用日志和DI。以下是ASP.NET Core 6最小API中使用日志和DI示例详解的完整攻略: 步骤一:创建最小API 首先,需要创建一个最小…

    C# 2023年5月17日
    00
  • 详解如何利用C#实现汉字转拼音功能

    下面是关于如何利用C#实现汉字转拼音功能的完整攻略: 1. 准备工作 实现汉字转拼音需要使用到拼音库,这里我推荐使用Pinyin4Net库。首先需要在VS中安装Pinyin4Net库。 安装方法: 打开VS,创建一个新的C#控制台应用程序。 在解决方案资源管理器中,右键单击该项目,选择“管理NuGet程序包”。 在弹出的NuGet管理器中,搜索“Pinyin…

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