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版)
2032 0
|
7月前
|
存储 JSON API
乐天(Letian)商品详情API接口系列,json数据返回
日本乐天商品详情 API(IchibaItem/Item)返回的 JSON 数据结构,会随formatVersion参数不同而变化,推荐使用formatVersion=2(结构更清晰、字段更规范)。以下是完整的 JSON 数据结构解析、核心字段说明、示例数据及实用解析技巧,适配跨境选品、海外仓对接等业务场景。
|
7月前
|
C#
C# 利用特性(Attribute)实现自定义验证
通过自定义特性(如RequiredAttribute)标记类属性,利用反射实现数据验证逻辑。示例代码展示了如何在对象中检查必填字段,并输出验证错误信息,实现灵活的数据校验机制。
|
7月前
|
C# 图形学 Windows
C# 制作 Windows Forms 图形验证码(带干扰线)
WinForms图形验证码利用Graphics绘制字符、干扰线与噪点,支持刷新及随机颜色、旋转,增强防破解能力,提升安全性。
|
消息中间件 监控 算法
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
|
JavaScript 前端开发 安全
一个贼丝滑的 Vue 2 扩展组件,开源且免费
一个贼丝滑的 Vue 2 扩展组件,开源且免费
|
SQL 数据库
SQL查询中排除空值列的技巧与方法
在数据库查询中,经常需要处理包含空值(NULL)的数据列
2595 3
|
前端开发 安全 Java
【Spring】Spring Boot项目创建和目录介绍
【Spring】Spring Boot项目创建和目录介绍
572 2
|
开发框架 .NET Windows
IIS程序后台上传文件报错 413 Request Entity Too Large
IIS程序后台上传文件报错 413 Request Entity Too Large
|
数据可视化 C# 开发工具
C#或Winform中的消息通知之系统本地通知(local toast notification)
C#应用通过 Microsoft.Toolkit.Uwp.Notifications NuGet包可以很方便的发送本地通知,适用于所有类型的应用(WPF、UWP、WinForms、控制台)
3028 0
C#或Winform中的消息通知之系统本地通知(local toast notification)