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版)
2167 0
|
10月前
|
算法 C#
C# 实现字符串相似度计算(Levenshtein 算法)
介绍计算字符串编辑距离的算法,基于Levenshtein距离实现相似度分析,适用于搜索建议与拼写纠错,附C#代码示例。
小米手机 fastboot模式 显示 press any key to shutdown 解决方法(亲测有效,已解决)
小米手机 fastboot模式 显示 press any key to shutdown 解决方法(亲测有效,已解决)
3074 0
|
9月前
|
安全 Java 程序员
Spring Boot 4 + Kotlin 2.0:当“胶水框架”遇上“空安全超人”,Java 程序员直呼:我先学为敬!
Spring Boot 4 正式发布!全面拥抱 Kotlin 2.0 与 K2 编译器,空安全零妥协;`suspend` 函数直通 Controller,性能提升18%;IDEA 2025.3 深度集成,编译提速40%。Kotlin 终成“正宫”,开发更简、运行更快、调试更准。(239字)
630 1
|
10月前
|
存储 JSON API
乐天(Letian)商品详情API接口系列,json数据返回
日本乐天商品详情 API(IchibaItem/Item)返回的 JSON 数据结构,会随formatVersion参数不同而变化,推荐使用formatVersion=2(结构更清晰、字段更规范)。以下是完整的 JSON 数据结构解析、核心字段说明、示例数据及实用解析技巧,适配跨境选品、海外仓对接等业务场景。
|
10月前
|
C#
C# 利用特性(Attribute)实现自定义验证
通过自定义特性(如RequiredAttribute)标记类属性,利用反射实现数据验证逻辑。示例代码展示了如何在对象中检查必填字段,并输出验证错误信息,实现灵活的数据校验机制。
|
10月前
|
C# 图形学 Windows
C# 制作 Windows Forms 图形验证码(带干扰线)
WinForms图形验证码利用Graphics绘制字符、干扰线与噪点,支持刷新及随机颜色、旋转,增强防破解能力,提升安全性。
|
JavaScript 前端开发 安全
一个贼丝滑的 Vue 2 扩展组件,开源且免费
一个贼丝滑的 Vue 2 扩展组件,开源且免费
|
消息中间件 监控 算法
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用

热门文章

最新文章