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日

相关文章

  • C#怎么给PDF添加背景图片

    首先,我们可以使用iTextSharp库来实现给PDF添加背景图片的功能。iTextSharp是C#中的一个PDF处理库,可以用于创建、修改和转换PDF文档。 第一步是引入iTextSharp库。可以通过NuGet Package Manager来下载iTextSharp。 安装完毕后,在代码中引入iTextSharp库: using iTextSharp.…

    C# 2023年5月15日
    00
  • WPF如何绘制光滑连续贝塞尔曲线示例代码

    以下是关于如何在WPF中绘制光滑连续贝塞尔曲线的完整攻略。 1. 了解贝塞尔曲线 在开始绘制贝塞尔曲线之前,我们需要先了解贝塞尔曲线。贝塞尔曲线是由法国数学家Pierre Bézier所发明的数学曲线,通常用于二维或三维计算机图形中的路径和图形形状绘制。在WPF中,可以使用Path对象进行绘制。 贝塞尔曲线的基本元素是“控制点”,通过改变控制点可以构造不同形…

    C# 2023年6月6日
    00
  • C#字符串常见操作总结详解

    C#字符串常见操作总结详解 本文将为您详细介绍C#中关于字符串的常见操作,包括字符串的创建、比较、连接、替换、分割、转换等操作。 字符串的创建 在C#中,字符串可以通过以下方式创建: 字符串字面量 csharpstring str1 = “hello, world”; 使用关键字new创建字符串对象 csharpstring str2 = new strin…

    C# 2023年5月15日
    00
  • C#生成putty格式的ppk文件

    生成putty格式的ppk文件需要经过以下几个步骤: 生成SSH密钥对 首先需要在本地生成SSH密钥对,可以使用OpenSSH或PuTTY生成器工具。以下是使用OpenSSH生成SSH密钥对的步骤: 打开终端或命令行窗口。 在命令行中输入以下命令生成SSH密钥对: ssh-keygen -t RSA -b 2048 根据提示输入密钥名称、密码等相关信息,并确…

    C# 2023年6月7日
    00
  • js 模拟实现类似c#下的hashtable的简单功能代码

    要模拟实现类似C#下的Hashtable的简单功能代码,我们可以使用JavaScript的对象和数组。以下是几个简单的步骤来实现Hashtable的简单功能。 创建Hashtable类 首先,我们需要创建一个Hashtable类,可以使用class语法糖来完成这一步。 class Hashtable { constructor() { this._map =…

    C# 2023年6月6日
    00
  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
  • C#使用Dictionary拆分字符串与记录log方法

    一、概述 在C#编程过程中,使用Dictionary结构可以方便地将字符串拆分成基本单元,并快速处理。同时记录程序运行过程的log也是开发中非常重要的一项功能。本文将主要介绍如何使用Dictionary拆分字符串,并通过记录log方法实现字符串处理的详细攻略。 二、拆分字符串 在C#中,使用Split方法可以将字符串按照指定的分割符拆分成多个子字符串,同时也…

    C# 2023年5月31日
    00
  • C#创建控制Windows服务

    创建 Windows 服务可以让我们的程序在后台运行,从而实现一些后台任务,例如数据同步、邮件服务等。C#作为一门强大的编程语言,可以很方便地创建Windows服务。本文将提供C#创建控制Windows服务的完整攻略,内容包括创建 Windows 服务、安装和卸载服务、启动和停止服务,以及包含两个示例说明。 创建 Windows 服务 创建 Windows …

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