C# 实现图片验证码的 WebAPI 版(ASP.NET Core)

简介: 基于ASP.NET Core实现的验证码服务,生成带干扰线和随机旋转文字的4位图文验证码,支持内存存储与验证。需安装System.Drawing.Common包。

using Microsoft.AspNetCore.Mvc;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class CaptchaController : ControllerBase
{
// 存储验证码的内存缓存(生产环境建议用分布式缓存)
private static readonly ConcurrentDictionary _captchaStore = new();

// 获取验证码图片
[HttpGet("image/{token}")]
public IActionResult GetCaptchaImage(string token, int width = 120, int height = 40)
{
    // 生成4位数字+字母验证码
    var captchaCode = GenerateRandomCode(4);
    _captchaStore[token] = captchaCode;

    // 创建位图
    using var bitmap = new Bitmap(width, height);
    using var g = Graphics.FromImage(bitmap);
    // 设置背景色
    g.Clear(Color.White);

    // 绘制干扰线
    var random = new Random();
    for (int i = 0; i < 5; i++)
    {
        using var pen = new Pen(Color.FromArgb(random.Next(256), random.Next(256), random.Next(256)), 1);
        g.DrawLine(pen, random.Next(width), random.Next(height), random.Next(width), random.Next(height));
    }

    // 绘制验证码文字
    using var font = new Font("Arial", 18, FontStyle.Bold | FontStyle.Italic);
    for (int i = 0; i < captchaCode.Length; i++)
    {
        using var brush = new SolidBrush(Color.FromArgb(random.Next(256), random.Next(256), random.Next(256)));
        // 文字随机偏移和旋转
        var x = 10 + i * 25;
        var y = random.Next(5, 15);
        g.RotateTransform(random.Next(-15, 15));
        g.DrawString(captchaCode[i].ToString(), font, brush, x, y);
        g.ResetTransform();
    }

    // 绘制干扰点
    for (int i = 0; i < 200; i++)
    {
        bitmap.SetPixel(random.Next(width), random.Next(height), Color.FromArgb(random.Next(256)));
    }

    // 输出图片流
    using var ms = new MemoryStream();
    bitmap.Save(ms, ImageFormat.Png);
    return File(ms.ToArray(), "image/png");
}

// 验证验证码
[HttpPost("verify/{token}")]
public IActionResult VerifyCaptcha(string token, [FromBody] string inputCode)
{
    if (_captchaStore.TryGetValue(token, out var realCode))
    {
        _captchaStore.TryRemove(token, out _); // 验证后立即失效
        if (string.Equals(realCode, inputCode, StringComparison.OrdinalIgnoreCase))
        {
            return Ok(new { Success = true, Message = "验证通过" });
        }
    }
    return Ok(new { Success = false, Message = "验证码错误或已过期" });
}

// 生成随机验证码
private string GenerateRandomCode(int length)
{
    var chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 排除易混淆字符
    var random = new Random();
    var code = new char[length];
    for (int i = 0; i < length; i++)
    {
        code[i] = chars[random.Next(chars.Length)];
    }
    return new string(code);
}

}
注意:ASP.NET Core 项目需安装System.Drawing.Common NuGet 包。

相关文章
|
前端开发 数据可视化 JavaScript
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
1717 0
|
3月前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1817 6
|
3月前
|
安全 测试技术 Linux
Acunetix v25.12.5 发布,新增功能简介
Acunetix v25.12.5 (Linux, Windows) - Web 应用程序安全测试
177 0
Acunetix v25.12.5 发布,新增功能简介
|
3月前
|
C#
C# 利用特性(Attribute)实现自定义验证
通过自定义特性(如RequiredAttribute)标记类属性,利用反射实现数据验证逻辑。示例代码展示了如何在对象中检查必填字段,并输出验证错误信息,实现灵活的数据校验机制。
|
JavaScript 前端开发 安全
一个贼丝滑的 Vue 2 扩展组件,开源且免费
一个贼丝滑的 Vue 2 扩展组件,开源且免费
|
消息中间件 监控 算法
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
|
存储 开发框架 前端开发
在EasyUI项目中使用FileBox控件实现文件上传处理
在EasyUI项目中使用FileBox控件实现文件上传处理
|
存储 缓存 数据安全/隐私保护
【.NET Core】深入理解IO - FileSteam流
【.NET Core】深入理解IO - FileSteam流
357 2
easyui-textbox 和 easyui-validatebox 设置值和获取值
easyui-textbox 和 easyui-validatebox 设置值和获取值
544 1
|
前端开发 JavaScript
【前端用法】如何让html引用公共的头部和尾部(多个html文件公用一个header.html和footer.html)
【前端用法】如何让html引用公共的头部和尾部(多个html文件公用一个header.html和footer.html)
432 0

热门文章

最新文章

下一篇
开通oss服务