应无所住,而生其心
排名
21
文章
27
粉丝
11
评论
12
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

net core 使用Lazy.Captcha.Core实现图片验证码

1773人阅读 2024/4/6 21:36 总访问:5182491 评论:0 收藏:0 手机
分类: .NET Core

官方网址:
https://gitee.com/pojianbing/lazy-captcha

安装依赖

  1. Install-Package Lazy.Captcha.Core

注册服务

可以直接这样非常简单的注入,使用的就是默认的配置

  1. // 默认使用内存存储(AddDistributedMemoryCache)
  2. services.AddCaptcha();

也可以使用代码在提供配置

  1. // 注册服务的时候增加配置
  2. services.AddCaptcha(Configuration, option =>
  3. {
  4. option.CaptchaType = CaptchaType.WORD; // 验证码类型
  5. option.CodeLength = 6; // 验证码长度, 要放在CaptchaType设置后. 当类型为算术表达式时,长度代表操作的个数
  6. option.ExpirySeconds = 30; // 验证码过期时间
  7. option.IgnoreCase = true; // 比较时是否忽略大小写
  8. option.StoreageKeyPrefix = ""; // 存储键前缀
  9. option.ImageOption.Animation = true; // 是否启用动画
  10. option.ImageOption.FrameDelay = 30; // 每帧延迟,Animation=true时有效, 默认30
  11. option.ImageOption.Width = 150; // 验证码宽度
  12. option.ImageOption.Height = 50; // 验证码高度
  13. option.ImageOption.BackgroundColor = SkiaSharp.SKColors.White; // 验证码背景色
  14. option.ImageOption.BubbleCount = 2; // 气泡数量
  15. option.ImageOption.BubbleMinRadius = 5; // 气泡最小半径
  16. option.ImageOption.BubbleMaxRadius = 15; // 气泡最大半径
  17. option.ImageOption.BubbleThickness = 1; // 气泡边沿厚度
  18. option.ImageOption.InterferenceLineCount = 2; // 干扰线数量
  19. option.ImageOption.FontSize = 36; // 字体大小
  20. option.ImageOption.FontFamily = DefaultFontFamilys.Instance.Actionj; // 字体
  21. /*
  22. * 中文使用kaiti,其他字符可根据喜好设置(可能部分转字符会出现绘制不出的情况)。
  23. * 当验证码类型为“ARITHMETIC”时,不要使用“Ransom”字体。(运算符和等号绘制不出来)
  24. */
  25. option.ImageOption.TextBold = true;// 粗体,该配置2.0.3新增
  26. });

也可以把配置写到配置文件中
先把配置写到配置文件中

  1. {
  2. "ConnectionStrings": {
  3. // 使用Redis缓存时,需要配置此项
  4. // 使用格式参考 Microsoft.Extensions.Caching.StackExchangeRedis
  5. "RedisCache": "localhost,password=Aa123456."
  6. },
  7. "CaptchaOptions": {
  8. "CaptchaType": 5, // 验证码类型
  9. "CodeLength": 4, // 验证码长度, 要放在CaptchaType设置后 当类型为算术表达式时,长度代表操作的个数, 例如2
  10. "ExpirySeconds": 60, // 验证码过期秒数
  11. "IgnoreCase": true, // 比较时是否忽略大小写
  12. "StoreageKeyPrefix": "", // 存储键前缀
  13. "ImageOption": {
  14. "Animation": false, // 是否启用动画
  15. "FontSize": 32, // 字体大小
  16. "Width": 100, // 验证码宽度
  17. "Height": 40, // 验证码高度
  18. "BubbleMinRadius": 5, // 气泡最小半径
  19. "BubbleMaxRadius": 10, // 气泡最大半径
  20. "BubbleCount": 3, // 气泡数量
  21. "BubbleThickness": 1.0, // 气泡边沿厚度
  22. "InterferenceLineCount": 3, // 干扰线数量
  23. "FontFamily": "kaiti", // 包含actionj,epilog,fresnel,headache,lexo,prefix,progbot,ransom,robot,scandal,kaiti
  24. "FrameDelay": 15, // 每帧延迟,Animation=true时有效, 默认30
  25. "BackgroundColor": "#ffffff", // 格式: rgb, rgba, rrggbb, or rrggbbaa format to match web syntax, 默认#fff
  26. "ForegroundColors": "", // 颜色格式同BackgroundColor,多个颜色逗号分割,随机选取。不填,空值,则使用默认颜色集
  27. "Quality": 100, // 图片质量(质量越高图片越大,gif调整无效可能会更大)
  28. "TextBold": false // 粗体,该配置2.0.3新增
  29. }
  30. }
  31. }

然后使用这样的方式注入

  1. builder.Services.AddCaptcha(builder.Configuration);

生成验证码与验证是否输入正确

创建一个控制器,加入两个方法,一个用于生成验证码一个用于验证验证码是否输入正确

  1. public class CaptchaController : Controller
  2. {
  3. private readonly ICaptcha _captcha;
  4. public CaptchaController(ICaptcha captcha)
  5. {
  6. _captcha = captcha;
  7. }
  8. /// <summary>
  9. /// 生成验证码
  10. /// </summary>
  11. /// <param name="id"></param>
  12. /// <returns></returns>
  13. [HttpGet]
  14. public IActionResult Captcha(string id)
  15. {
  16. var info = _captcha.Generate(id);
  17. // 有多处验证码且过期时间不一样,可传第二个参数覆盖默认配置。
  18. //var info = _captcha.Generate(id,120);
  19. var stream = new MemoryStream(info.Bytes);
  20. return File(stream, "image/gif");
  21. }
  22. /// <summary>
  23. /// 验证验证码是否输入正确
  24. /// </summary>
  25. [HttpGet]
  26. public bool Validate(string id, string code)
  27. {
  28. return _captcha.Validate(id, code);
  29. }
  30. }

访问这个/Captcha/Captcha/11 生成验证码:

访问/Captcha/validate?id=11&code=sqhwzn验证验证码是否输入正确

使用注意

客户端传递过去生成验证码的id应该是唯一的

注意验证验证码是否输入正确的时候他是根据id匹配生成的验证码,也就是说id不能写死,不然多个人使用的时候你看到的验证码,可能就会被其他人替换掉了,所以不同的客户端传递过去生成验证码的id应该是唯一的。也可以修改成在后端用guid来作为key存储在session,cookie等包含状态的里边。

比如下面的写法就是存储在cookie中的:

  1. using Lazy.Captcha.Core;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. namespace TNBLOG.Login.Controllers
  9. {
  10. public class CaptchaController : Controller
  11. {
  12. private readonly ICaptcha _captcha;
  13. public CaptchaController(ICaptcha captcha)
  14. {
  15. _captcha = captcha;
  16. }
  17. /// <summary>
  18. /// 生成验证码
  19. /// </summary>
  20. /// <param name="id"></param>
  21. /// <returns></returns>
  22. [HttpGet]
  23. public IActionResult Captcha()
  24. {
  25. string guid = Guid.NewGuid().ToString("N");
  26. // 把验证码的id存储在cookie中
  27. HttpContext.Response.Cookies.Append("captchaId", guid);
  28. var info = _captcha.Generate(guid);
  29. var stream = new MemoryStream(info.Bytes);
  30. return File(stream, "image/gif");
  31. }
  32. /// <summary>
  33. /// 验证验证码是否输入正确
  34. /// </summary>
  35. [HttpGet]
  36. public bool Validate(string code)
  37. {
  38. // 从cookie中取出来验证码的id
  39. string captchaId = HttpContext.Request.Cookies["captchaId"]?.ToString();
  40. return _captcha.Validate(captchaId, code, false);
  41. }
  42. }
  43. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

叼着奶瓶逛酒吧

2019/4/23 15:24:22

文章写得真心不错,加油哈[赞]

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...