概述

几年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据。为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码!

验证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操作。这样各种机器人程序就被拒之门外了!

验证码使用

验证码是针对各种机器人程序的,所以验证码图片中的内容是不能存放在Cookie、HTML和URL中的

代码实现

引用nuget包

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

创建VierificationCodeServices

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;namespace CompanyName.ProjectName.Core
{/// <summary>/// 验证码/// </summary>public class VierificationCodeServices{/// <summary>/// 该方法用于生成指定位数的随机数/// </summary>/// <param name="VcodeNum">参数是随机数的位数</param>/// <returns>返回一个随机数字符串</returns>private static string RndNum(int VcodeNum){//验证码可以显示的字符集合string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +",R,S,T,U,V,W,X,Y,Z";string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组string code = "";//产生的随机数int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数Random rand = new Random();//采用一个简单的算法以保证生成随机数的不同for (int i = 1; i < VcodeNum + 1; i++){if (temp != -1){rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类}int t = rand.Next(61);//获取随机数if (temp != -1 && temp == t){return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用}temp = t;//把本次产生的随机数记录起来code += VcArray[t];//随机数的位数加一}return code;}/// <summary>/// 该方法是将生成的随机数写入图像文件/// </summary>/// <param name="code">code是一个随机数</param>/// <param name="numbers">生成位数(默认4位)</param>public static MemoryStream Create(out string code, int numbers = 4){code = RndNum(numbers);Bitmap Img = null;Graphics g = null;MemoryStream ms = null;Random random = new Random();//验证码颜色集合Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };//验证码字体集合string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };//定义图像的大小,生成图像的实例Img = new Bitmap((int)code.Length * 18, 32);g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象g.Clear(Color.White);//背景设为白色//在随机位置画背景点for (int i = 0; i < 100; i++){int x = random.Next(Img.Width);int y = random.Next(Img.Height);g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);}//验证码绘制在g中for (int i = 0; i < code.Length; i++){int cindex = random.Next(7);//随机颜色索引值int findex = random.Next(5);//随机字体索引值Font f = new Font(fonts[findex], 15, FontStyle.Bold);//字体Brush b = new SolidBrush(c[cindex]);//颜色int ii = 4;if ((i + 1) % 2 == 0)//控制验证码不在同一高度{ii = 2;}g.DrawString(code.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符}ms = new MemoryStream();//生成内存流对象Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中//回收资源g.Dispose();Img.Dispose();return ms;}}
}

生成ValidateCode

/// <summary>/// 图形验证码/// </summary>/// <returns></returns>public IActionResult ValidateCode(){string code = "";MemoryStream ms = VierificationCodeServices.Create(out code);HttpContext.Session.SetString("LoginValidateCode", code);Response.Body.Dispose();return File(ms.ToArray(), @"image/png");}

ASP.NET Core 跨平台图形验证码实现相关推荐

  1. [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现

    写在前面 说起来比较丢脸.我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.Net Framework的,使用的包是System.Drawing,我把这验证码绘制逻辑复 ...

  2. ASP.NET Core跨平台技术内幕

    ASP.NET Core设计初衷是开源跨平台.高性能Web服务器,其中跨平台特性较早期ASP.NET是一个显著的飞跃,.NET现可以理直气壮与JAVA同台竞技,而ASP.NET Core的高性能特性更 ...

  3. asp.net core 腾讯验证码的接入

    asp.net core 腾讯验证码的接入 Intro 之前使用的验证码服务是用的极验验证,而且是比较旧的,好久之前接入的,而且验证码服务依赖 Session,有点不太灵活,后来发现腾讯也有验证码服务 ...

  4. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序,看起来非常不错,不是吗?那么,如果我们希望真正在实际的生产环境去部署和运行这个应用程序,应该怎 ...

  5. [Hei.Captcha] Asp.Net Core 跨平台验证码实现

     写在前面 说起来比较丢脸.我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.Net Framework的,使用的包是System.Drawing,我把这验证码绘制 ...

  6. .Net Core跨平台 图片验证码

    使用传统的system.Drawing 生成的验证码在Linux上发布时容易报错或者图片不正常 这里推荐使用Hei.Captcha来进行验证码接口的开发 github地址:neoayi/Hei.Cap ...

  7. 在Docker中运行asp.net core 跨平台应用程序

    概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...

  8. .Net Core 之 图形验证码 本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能。...

    本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能. 通过测试的系统: Windows 8.1 64bit Ubuntu Server 16.04 LTS 64 ...

  9. ASP.NET Core端点路由 作用原理

    端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民.Endpoint Routing的动机 在端点路由出现之前,我们一 ...

最新文章

  1. Vue.js 第二天: 列表渲染
  2. pytorch1.0.1_将Spring 3.x和Hibernate 3.x升级到Spring Platform 1.0.1(Spring + hibernate 4.x)
  3. .NET部分知识点整理
  4. 【SICP练习】66 练习2.37
  5. Shell_参数替换(転)
  6. select语句 rows相等_我去,这两个小技巧,让我的SQL语句不仅躲了坑,还提升了 1000 倍(半分钟干货系列)...
  7. 系统集成资质-信息系统项目管理师考试综合介绍
  8. 实习踩坑之路:Mybatis写的sql语句有<符号的问题导致项目启动失败以及count(*)怎么对应到某个实体类的字段
  9. top 显示按照内存、CPU排序
  10. 管理感悟:不要告诉主管只有一条路
  11. Spring Cloud Alibaba Sentinel之入门篇
  12. 横向合计代码 锐浪报表_报表开发常见问题解答 - 锐浪报表工具
  13. 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
  14. 如何在win10中迅速打开命令提示符
  15. 金庸小说人物知识图谱构建——图谱可视化
  16. 数据库------MYSQL
  17. 用Python实现无条件重复循环
  18. JS获取当前网页大小以及屏幕分辨率等
  19. 让你的linux fedora 超过mac帅
  20. 智力题(每日更新-转载记录niuke网)

热门文章

  1. 微信小程序开发 Request Headers: Provisional headers are shown
  2. UBUNTU 用户及用户组管理 修改用户和主机名
  3. MySQL 实用语句集合
  4. 多层装饰器、带参数装饰器
  5. Linux 添加新用户账号并赋予root权限
  6. Java发送邮件(带附件)
  7. SD 胡策 Round 1 T3 彩尾巴猹的二进制数
  8. 三)mybatis 二级缓存,整合ehcache
  9. nmap脚本使用总结
  10. 【Maven实用技巧】03. Maven 编译打包时如何忽略测试用例