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#实现网络爬虫 C#抓取网页Html源码

    下面是“基于C#实现网络爬虫 C#抓取网页Html源码”的完整攻略: 一、网络爬虫简介 网络爬虫,也称为网络蜘蛛、网络机器人等,是一种自动化的程序,用于在互联网上通过各种方式获取信息。 二、C#抓取网页Html源码 1. 使用C#自带的WebClient类 C#自带的WebClient类可以轻松地访问网页,并将其HTML源码下载到本地。下面是一个示例代码: …

    C# 2023年6月6日
    00
  • 如何通过C#/VB.NET代码将PowerPoint转换为HTML

    利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强。但难免在某些情况下我们会需要将PowerPoint转换为HTML格式。因为HTML文档能独立于各种操作系统平台(如Unix,Windows等)。并且它可以加入图片、声音、动画、影视等内容,还能从一个文件跳转到另一个文件,与世界各地主机的文件连接。通过HTML可以表现出丰富多彩的…

    C# 2023年5月5日
    00
  • C#中foreach循环对比for循环的优势和劣势

    当需要遍历集合或数组时,在C#中通常可以使用for循环或foreach循环。那么,在foreach循环和for循环之间存在什么区别呢?哪种循环更适合特定的情况呢?接下来,我们将详细讲解C#中foreach循环和for循环的优劣势及其适用场景。 foreach循环的优势和劣势 优势 简单易读:使用foreach循环可以更直观、自然地遍历一个集合(例如List、…

    C# 2023年6月7日
    00
  • C# Base 64 编码/解码实现代码

    下面我会详细讲解“C# Base 64 编码/解码实现代码”的完整攻略: 简介 Base 64 编码是一种常见的用于传输二进制数据的编码方式,通常用于在网络传输中将二进制的数据转换为 ASCII 字符串,方便传输和存储。C# 中提供了对 Base 64 编码和解码的支持,使用非常方便。 Base 64 编码实现 C# 中实现 Base 64 编码的方法非常简…

    C# 2023年5月31日
    00
  • Blazor组件事件处理功能

    Blazor组件事件处理功能是指在Blazor应用中,可以通过组件级别的事件处理来响应用户的操作或操作结果。下面我将详细介绍它的完整攻略及两个示例说明。 Blazor组件事件处理功能完整攻略 Blazor组件事件处理功能主要分为以下几步: 第一步:定义组件 首先我们需要定义一个组件,并定义该组件内部需要使用的事件。可以通过以下方式定义事件: [Paramet…

    C# 2023年6月3日
    00
  • 探讨Object转为String的几种简易形式详解

    关于“探讨Object转为String的几种简易形式详解”的完整攻略,我们可以以以下结构来进行讲解: 探讨 Object 转为 String 的几种简易形式详解 一、Object 转 String 的默认形式 我们首先需要明确的是,当一个 Object 转为 String 时,会有一个默认的转换方式。这个过程可以通过 Object 中的 toString()…

    C# 2023年5月15日
    00
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    以下是将C#编写的程序打包成应用程序的实现步骤分享,包括安装和卸载,以及附有两个示例说明。 1. 编写C#程序 首先,我们需要编写C#程序。具体代码的编写不在本文的讨论范围内,这里简单介绍一下如何创建一个C#程序: 打开Visual Studio,并选择创建新的项目。 在弹出的窗口中选择“Visual C#”和“控制台应用程序”。 设置项目名称和存放位置,并…

    C# 2023年6月3日
    00
  • c#调用c++方法介绍,window api

    C#调用C++方法介绍 简介 C#是一种高级编程语言,而C++是一种中级编程语言,在底层处理方面有着突出的优势。将C++模块集成到C#应用程序中,可以利用C++的性能和底层优势来完成一些高性能任务。在实际应用中,使用C#调用C++模块的场景非常普遍,例如Windows API和某些组件库都是基于C++编写的,但是由于其底层特性和页面优化等方面,利用C#调用C…

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