TNBLOG
首页
博客
视频
资源
问答
猿趣
手机
关于
搜索
收藏
便签
笔记
消息
创作
登录
剑轩
应无所住,而生其心
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
CSS
16篇
微服务
41篇
Git
15篇
.NET
104篇
移动开发
33篇
软件架构
23篇
.NET Core
119篇
.NET MVC
11篇
英语
3篇
随笔
90篇
Bootstrap
3篇
Redis
21篇
编辑器
10篇
Js相关
15篇
虚拟化
8篇
更多
Oracle
7篇
Python
14篇
数据库
26篇
EF
17篇
微信
3篇
前端
160篇
消息队列
6篇
docker
41篇
多线程
1篇
Java
4篇
软件基础
2篇
C++
2篇
WCF
7篇
Linux
7篇
nginx
5篇
K8S
9篇
ABP
2篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术
原
net core 使用Lazy.Captcha.Core实现图片验证码
612
人阅读
2024/4/6 21:36
总访问:
4428145
评论:
0
收藏:
0
手机
分类:
.NET Core
官方网址: https://gitee.com/pojianbing/lazy-captcha [TOC] ### 安装依赖 ``` Install-Package Lazy.Captcha.Core ``` ### 注册服务 **可以直接这样非常简单的注入,使用的就是默认的配置** ``` // 默认使用内存存储(AddDistributedMemoryCache) services.AddCaptcha(); ``` **也可以使用代码在提供配置** ``` // 注册服务的时候增加配置 services.AddCaptcha(Configuration, option => { option.CaptchaType = CaptchaType.WORD; // 验证码类型 option.CodeLength = 6; // 验证码长度, 要放在CaptchaType设置后. 当类型为算术表达式时,长度代表操作的个数 option.ExpirySeconds = 30; // 验证码过期时间 option.IgnoreCase = true; // 比较时是否忽略大小写 option.StoreageKeyPrefix = ""; // 存储键前缀 option.ImageOption.Animation = true; // 是否启用动画 option.ImageOption.FrameDelay = 30; // 每帧延迟,Animation=true时有效, 默认30 option.ImageOption.Width = 150; // 验证码宽度 option.ImageOption.Height = 50; // 验证码高度 option.ImageOption.BackgroundColor = SkiaSharp.SKColors.White; // 验证码背景色 option.ImageOption.BubbleCount = 2; // 气泡数量 option.ImageOption.BubbleMinRadius = 5; // 气泡最小半径 option.ImageOption.BubbleMaxRadius = 15; // 气泡最大半径 option.ImageOption.BubbleThickness = 1; // 气泡边沿厚度 option.ImageOption.InterferenceLineCount = 2; // 干扰线数量 option.ImageOption.FontSize = 36; // 字体大小 option.ImageOption.FontFamily = DefaultFontFamilys.Instance.Actionj; // 字体 /* * 中文使用kaiti,其他字符可根据喜好设置(可能部分转字符会出现绘制不出的情况)。 * 当验证码类型为“ARITHMETIC”时,不要使用“Ransom”字体。(运算符和等号绘制不出来) */ option.ImageOption.TextBold = true;// 粗体,该配置2.0.3新增 }); ``` **也可以把配置写到配置文件中** 先把配置写到配置文件中 ``` { "ConnectionStrings": { // 使用Redis缓存时,需要配置此项 // 使用格式参考 Microsoft.Extensions.Caching.StackExchangeRedis "RedisCache": "localhost,password=Aa123456." }, "CaptchaOptions": { "CaptchaType": 5, // 验证码类型 "CodeLength": 4, // 验证码长度, 要放在CaptchaType设置后 当类型为算术表达式时,长度代表操作的个数, 例如2 "ExpirySeconds": 60, // 验证码过期秒数 "IgnoreCase": true, // 比较时是否忽略大小写 "StoreageKeyPrefix": "", // 存储键前缀 "ImageOption": { "Animation": false, // 是否启用动画 "FontSize": 32, // 字体大小 "Width": 100, // 验证码宽度 "Height": 40, // 验证码高度 "BubbleMinRadius": 5, // 气泡最小半径 "BubbleMaxRadius": 10, // 气泡最大半径 "BubbleCount": 3, // 气泡数量 "BubbleThickness": 1.0, // 气泡边沿厚度 "InterferenceLineCount": 3, // 干扰线数量 "FontFamily": "kaiti", // 包含actionj,epilog,fresnel,headache,lexo,prefix,progbot,ransom,robot,scandal,kaiti "FrameDelay": 15, // 每帧延迟,Animation=true时有效, 默认30 "BackgroundColor": "#ffffff", // 格式: rgb, rgba, rrggbb, or rrggbbaa format to match web syntax, 默认#fff "ForegroundColors": "", // 颜色格式同BackgroundColor,多个颜色逗号分割,随机选取。不填,空值,则使用默认颜色集 "Quality": 100, // 图片质量(质量越高图片越大,gif调整无效可能会更大) "TextBold": false // 粗体,该配置2.0.3新增 } } } ``` 然后使用这样的方式注入 ``` builder.Services.AddCaptcha(builder.Configuration); ``` ### 生成验证码与验证是否输入正确 创建一个控制器,加入两个方法,一个用于生成验证码一个用于验证验证码是否输入正确 ``` public class CaptchaController : Controller { private readonly ICaptcha _captcha; public CaptchaController(ICaptcha captcha) { _captcha = captcha; } /// <summary> /// 生成验证码 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet] public IActionResult Captcha(string id) { var info = _captcha.Generate(id); // 有多处验证码且过期时间不一样,可传第二个参数覆盖默认配置。 //var info = _captcha.Generate(id,120); var stream = new MemoryStream(info.Bytes); return File(stream, "image/gif"); } /// <summary> /// 验证验证码是否输入正确 /// </summary> [HttpGet] public bool Validate(string id, string code) { return _captcha.Validate(id, code); } } ``` **访问这个`/Captcha/Captcha/11` 生成验证码:** ![](https://img.tnblog.net/arcimg/aojiancc2/e6face2fd59248c7988c1b22ca8f110c.png) **访问`/Captcha/validate?id=11&code=sqhwzn`验证验证码是否输入正确** ![](https://img.tnblog.net/arcimg/aojiancc2/e5db49a79d294cf7a95a8fefbf71f38a.png) ### 使用注意 #### 客户端传递过去生成验证码的id应该是唯一的 注意验证验证码是否输入正确的时候他是根据id匹配生成的验证码,也就是说id不能写死,不然多个人使用的时候你看到的验证码,可能就会被其他人替换掉了,所以不同的客户端传递过去生成验证码的id应该是唯一的。也可以修改成在后端用guid来作为key存储在session,cookie等包含状态的里边。 比如下面的写法就是存储在cookie中的: ``` using Lazy.Captcha.Core; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace TNBLOG.Login.Controllers { public class CaptchaController : Controller { private readonly ICaptcha _captcha; public CaptchaController(ICaptcha captcha) { _captcha = captcha; } /// <summary> /// 生成验证码 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet] public IActionResult Captcha() { string guid = Guid.NewGuid().ToString("N"); // 把验证码的id存储在cookie中 HttpContext.Response.Cookies.Append("captchaId", guid); var info = _captcha.Generate(guid); var stream = new MemoryStream(info.Bytes); return File(stream, "image/gif"); } /// <summary> /// 验证验证码是否输入正确 /// </summary> [HttpGet] public bool Validate(string code) { // 从cookie中取出来验证码的id string captchaId = HttpContext.Request.Cookies["captchaId"]?.ToString(); return _captcha.Validate(captchaId, code, false); } } } ```
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}