asp.net登录验证码实现方法

实现一个 ASP.NET 登录验证码的方法如下:

  1. 安装 NuGet 包

使用NuGet包管理器控制台:

Install-Package Microsoft.AspNet.WebPages.OAuth -Version 3.2.3
  1. 在应用程序配置文件中添加配置

在应用程序的 web.config 配置文件中,添加以下配置来设置验证码选项:

<appSettings>
  <add key="ValidationCode:Width" value="100" />
  <add key="ValidationCode:Height" value="36" />
  <add key="ValidationCode:Length" value="4" />
</appSettings>

上面的配置是设置验证码宽度为 100 像素,高度为 36 像素,验证码长度为 4。

  1. 实现验证码生成

在 ASP.NET 的 MVC 控制器中实现验证码的生成代码:

public ActionResult ValidationCode()
{
    int width = int.Parse(ConfigurationManager.AppSettings["ValidationCode:Width"]);
    int height = int.Parse(ConfigurationManager.AppSettings["ValidationCode:Height"]);
    int length = int.Parse(ConfigurationManager.AppSettings["ValidationCode:Length"]);

    var validationCode = new ValidationCode(width, height, length);
    var code = validationCode.CreateValidationCode();
    var image = validationCode.CreateImageOnPage(code);

    Response.ClearContent();
    Response.ContentType = "image/Gif";
    image.Save(Response.OutputStream, ImageFormat.Gif);
    Response.End();

    return null;
}

上述代码通过读取 web.config 文件中的配置项,从而设置验证码的大小和长度。ValidationCode 类封装了验证码的生成和绘制方法,CreateValidationCode() 方法用于生成验证码,CreateImageOnPage() 方法用于在页面上绘制验证码。

  1. 在登录页面中添加验证码控件

在 ASP.NET 所使用的登录页面视图文件中,添加以下代码来生成验证码:

<img src="@Url.Action("ValidationCode")" />
<input type="text" name="VerifyCode" id="VerifyCode" />

这里使用 ASP.NET 的 Url.Action() 方法来生成验证码的 URL 地址,从而显示验证码图片。

  1. 验证码判断

在登录验证的处理程序中,添加以下代码来判断输入的验证码是否正确:

string verifyCode = Request.Form["VerifyCode"];
if (string.Equals(Session["VerifyCode"] as string, verifyCode, StringComparison.OrdinalIgnoreCase) == false)
{
    ModelState.AddModelError("VerifyCode", "Verification code is invalid.");
}

上述代码从表单中获取验证码输入值,然后与会话中保存的验证码进行比对,如果不一致,就认为验证码输入错误。

实现过程中,需要注意以下几点:

  • 在生成验证码的代码中,需要使用 Response.End() 方法来结束响应,否则还会向客户端输出无用的 HTML 代码。
  • 在验证验证码的代码中,需要将验证码的输入值与 Session 中保存的验证码进行比对,而不是每次生成一个验证码时就保存一个新的 Session,否则会导致验证码无法正确验证。
  • 在开启验证码的情况下,需要通过 JavaScript 来禁用浏览器的表单自动填充功能,否则会导致验证码无法正确验证。

示例代码:

以下是一个基于 ASP.NET MVC 框架的完整登录验证码实现代码示例:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.Configuration;

namespace ASP.NET.Web.App.Helpers
{
    public class ValidationCode
    {
        private int width;
        private int height;
        private int length;

        public ValidationCode(int width, int height, int length)
        {
            this.width = width;
            this.height = height;
            this.length = length;
        }

        private const string VNum = "23456789";//数字
        private const string VLow = "abcdefghijklmnopqrstuvwxyz";//小写字母
        private const string VUpp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//大写字母

        private string CreateRandomCode()
        {
            var allChar = $"{VNum}{VLow}{VUpp}";
            var ran = new Random();
            var sb = new System.Text.StringBuilder(length);
            for (var i = 0; i < length; i++)
            {
                sb.Append(allChar[ran.Next(allChar.Length)]);
            }

            // 将验证码保存到 Session 中
            HttpContext.Current.Session["VerifyCode"] = sb.ToString();

            return sb.ToString();
        }

        public string CreateValidationCode()
        {
            return CreateRandomCode();
        }

        public Bitmap CreateImageOnPage(string code)
        {
            Bitmap bmp = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bmp);

            //产生随机双胞胎
            var random = new Random();
            var num = random.Next(10, 100);
            string currentNum = num.ToString();

            Pen pen = new Pen(Color.Black, 1);
            for (int i = 0; i < 1; i++)
            {
                Point beginPoint = new Point(random.Next(bmp.Width), random.Next(bmp.Height));
                Point endPoint = new Point(random.Next(bmp.Width), random.Next(bmp.Height));

                g.DrawLine(pen, beginPoint, endPoint);//划线
            }

            //画图
            char[] chars = code.ToCharArray();
            StringFormat format = new StringFormat(StringFormatFlags.NoClip);
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            Color[] color ={ Color.Red, Color.Black, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.DarkBlue };
            string[] font ={ "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
            int cindex, findex;
            for (int i = 0; i < chars.Length; i++)
            {
                if (random.Next(9) > 1) continue;//随机跳过一些字符,减少干扰项
                cindex = random.Next(7);
                findex = random.Next(5);
                Brush brush = new SolidBrush(color[cindex]);
                Font fontt = new Font(font[findex], 14, (FontStyle.Bold | FontStyle.Italic));
                Point _point = new Point(18 + i * 20, 16);
                g.DrawString(chars[i].ToString(), fontt, brush, _point, format);
            }
            //显示验证码图形
            g.DrawString(currentNum, new Font("微软雅黑", 10), Brushes.DarkRed, 1, 1);
            g.Dispose();
            return bmp;
        }
    }
}

控制器中的操作方法:

public ActionResult ValidationCode()
{
    int width = int.Parse(WebConfigurationManager.AppSettings["ValidationCode:Width"]);
    int height = int.Parse(WebConfigurationManager.AppSettings["ValidationCode:Height"]);
    int length = int.Parse(WebConfigurationManager.AppSettings["ValidationCode:Length"]);

    var validationCode = new ValidationCode(width, height, length);
    var code = validationCode.CreateValidationCode();
    var image = validationCode.CreateImageOnPage(code);

    Response.ClearContent();
    Response.ContentType = "image/Gif";

    image.Save(Response.OutputStream, ImageFormat.Gif);

    Response.End();

    return null;
}

登陆页面视图文件中的代码:

<div class="form-group">
    <label for="VerifyCode" class="col-sm-2 control-label">验证码</label>
    <div class="col-sm-6">
        <img src="@Url.Action("ValidationCode")" onclick="this.src = this.src + '?'" />
        <input type="text" name="VerifyCode" id="VerifyCode" placeholder="请输入验证码" class="form-control" data-val="true" data-val-required="验证码不能为空" aria-required="true" aria-describedby="VerifyCode-error" />
        <span class="field-validation-error" data-valmsg-for="VerifyCode" data-valmsg-replace="true"></span>
    </div>
</div>

以上就是 ASP.NET 实现登录验证码的完整攻略。

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

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • C#中IDispose接口的实现及为何这么实现详解

    下面是关于C#中IDisposable接口的实现及为何这么实现的详解,包含两个示例说明。 什么是IDisposable接口 在C#中,当需要使用一些非托管资源时(例如文件、数据库连接、Socket等等),程序需要手动释放这些资源,否则会造成占用资源过多,程序出现异常或运行缓慢等问题。为了实现资源的自动释放,C#定义了IDisposable接口。 IDispo…

    C# 2023年6月6日
    00
  • C#泛型实例详解

    C#泛型实例详解 本文将详细讲解C#泛型的使用方法与实例,并通过两个示例进行演示。 什么是泛型 泛型在C#中的作用类似于Java中的模板,它能够将具体的数据类型参数化,使得类或者方法可以适应多种不同类型的数据。 使用泛型还有以下优点: 提高程序的可读性和可维护性,减少重复的代码 编译时类型安全,避免因类型错误导致的运行时异常 避免了装箱和拆箱操作,提高了程序…

    C# 2023年5月15日
    00
  • .net 随机生成汉字

    下面是.NET随机生成汉字的完整攻略: 1.使用C#生成汉字 我们可以使用以下代码片段中的方法在C#中生成随机汉字: private static readonly Random Random = new Random(); public static string GenerateChineseCharacter(int length) { string[…

    C# 2023年5月31日
    00
  • .NET中堆栈和堆的特点与差异介绍

    在.NET中,堆和栈是两种常见的内存分配方式。堆和栈的特点和差异如下: 堆的特点 堆是一种动态分配的内存区域,用于存储对象和数据结构。 堆的大小可以动态增长或缩小,由垃圾回收器负责管理。 堆中的对象可以通过引用来访问,引用是指向对象在堆中的地址。 堆中的对象可以被多个线程共享。 堆中的对象的生命周期由垃圾回收器来管理。 栈的特点 栈是一种静态分配的内存区域,…

    C# 2023年5月17日
    00
  • ASP.NET Core中Startup类、Configure()方法及中间件详解

    在 ASP.NET Core 中,Startup 类是应用程序的入口点,它负责配置应用程序的服务和中间件。Configure() 方法是 Startup 类中的一个方法,它用于配置应用程序的 HTTP 请求管道。本文将详细讲解 Startup 类、Configure() 方法及中间件的相关知识。 Startup 类 Startup 类是 ASP.NET Co…

    C# 2023年5月17日
    00
  • jQuery与Ajax以及序列化

    jQuery是一个JavaScript库,它简化了JavaScript的编写,提供了许多实用的功能。其中,Ajax和序列化是jQuery中常用的两个功能。本文将提供使用jQuery进行Ajax请求和序列化的完整攻略,包括创建Ajax请求、序列化表单数据、处理响应等。同时,本文还提供两个示例,演示如何使用jQuery进行Ajax请求和序列化表单数据。 创建Aj…

    C# 2023年5月15日
    00
  • 详解SHA-256算法的原理以及C#和JS的实现

    详解SHA-256算法的原理以及C#和JS的实现 SHA-256算法的原理 SHA-256是一种哈希算法,可以将任意长度的消息转化为一组长度为256位的二进制数字,这组数字通常被称为哈希值。SHA-256的实际运用非常广泛,例如在数字签名、身份验证、电子邮件安全等领域都有着重要的应用。 SHA-256的核心是一系列的数据操作,包括对原始数据进行预处理、将处理…

    C# 2023年6月8日
    00
  • c#创建Graphics对象的三种方法

    让我们来详细讲解一下c#创建Graphics对象的三种方法。 前言 在C#中,我们可以使用Graphics对象来进行图形绘制操作,比如绘制直线、矩形、椭圆、多边形等。Graphics对象通常与平面控件(如PictureBox和Panel)配合使用,通过将图像绘制到控件上来实现绘制功能。那么在C#中,有哪些方法可以创建Graphics对象呢? 创建Graphi…

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