前言
在Web应用中,图形验证码(CAPTCHA)是防止自动化攻击的重要防线。推荐一个基于 .NET 的图形验证码模块,该模块不仅易于集成,还利用了 SkiaSharp 提供的强大性能优势。
项目介绍
项目最初发布的 v1 版本基于 ImageSharp,是一个纯托管的图像处理库,无需额外的本地依赖,非常适合快速部署到各种平台。
但是随着项目的发展和对更高性能的需求,推出了 v2 版本,该版本基于 SkiaSharp 开发。但发布到Linux时需要安装对应 NativeAssets(ImageSharp则不需要)。
项目特点
高性能:借助 SkiaSharp 的图像处理能力,验证码生成速度更快,资源消耗更低。
易集成:模块设计简洁,API 易于使用,能够快速集成到现有的 .NET 项目中。
跨平台支持:虽然在 Linux 环境下需要安装对应的 NativeAssets,但 SkiaSharp 依然提供了出色的跨平台兼容性。
项目使用
1、注册服务
builder.Services.AddCaptcha(builder.Configuration);
2、配置
appsettings.json (不提供配置时,使用默认配置)
{
  "ConnectionStrings": {
    
    
    "RedisCache": "localhost,password=Aa123456."
  },
  "CaptchaOptions": {
    "CaptchaType": 5, 
    "CodeLength": 4, 
    "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", 
      "FrameDelay": 15, 
      "BackgroundColor": "#ffffff", 
      "ForegroundColors": "", 
      "Quality": 100, 
      "TextBold": false 
    }
  }
}
配置可以通过运行Sample.Winfrom生成或直接下载Release运行。

代码配置
builder.Services.AddCaptcha(builder.Configuration, option =>
{
    option.CaptchaType = CaptchaType.WORD; 
    option.CodeLength = 6; 
    option.ExpirySeconds = 30; 
    option.IgnoreCase = true; 
    option.StoreageKeyPrefix = ""; 
    option.ImageOption.Animation = true; 
    option.ImageOption.FrameDelay = 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; 
    
    
     option.ImageOption.TextBold = true;
});
3、Controller
[Route("captcha")]
[ApiController]
public class CaptchaController : Controller
{
    private readonly ICaptcha _captcha;
    public CaptchaController(ICaptcha captcha)
    {
        _captcha = captcha;
    }
    [HttpGet]
    public IActionResult Captcha(string id)
    {
        var info = _captcha.Generate(id);
        
        
        var stream = new MemoryStream(info.Bytes);
        return File(stream, "image/gif");
    }
    
    
    
    [HttpGet("validate")]
    public bool Validate(string id, string code)
    {
        return _captcha.Validate(id, code);
    }
    
    
    
    
    [HttpGet("validate2")]
    public bool Validate2(string id, string code)
    {
        return _captcha.Validate(id, code, false);
    }
}
自定义随机验证码
动图和静态图随机出现, CaptchaType随机。
自定义字体
1、寻找字体
你可以通过fontspace找到自己喜爱的字体。
2、将字体放入项目,并设置为嵌入资源。
当然也可以不作为嵌入资源,放到特定目录也是可以的,只要对下边ResourceFontFamilysFinder稍作修改即可。

.NET Framework下使用
新建MVC项目.NET Framework 选择 4.6.2。
Nuget安装,先安装SkiaSharp, 再安装Lazy.Captcha.Core。
项目效果



项目地址
Gitee:gitee.com/pojianbing/…
总结
以上仅展示了LazyCaptcha v2图形验证码模块的部分功能。更多实用特性和详细信息,请大家访问项目地址。
转自https://juejin.cn/post/7488545861091278875
该文章在 2025/4/3 15:33:41 编辑过