Ape.Volo项目支持两种验证码方式:数字及数学公式,采用的验证码方式在Ape.Volo.Api项目的appsettings.json内的Captcha节配置,KeyLength属性值大于0时使用数字验证码,否则使用数学公式验证码。

Captcha节配置对应Ape.Volo.Core项目的CaptchaOptions类,属性含义如下图所示:

生成验证码及验证码图片的函数是Ape.Volo.Api项目的控制器类AuthorizationController的Captcha函数,主要代码如下图所示。函数的前半部分检查客户端输入的验证码次数,尝试的失败次数超过配置的次数限制则显示验证码,失败次数保存在缓存中,key值为固定字符串+客户端IP地址,数据超时时间在配置文件的Captcha节的TimeOut值配置。函数的后半部分根据Captcha节配置生成验证码及对应的图片,生成函数为Ape.Volo.Common项目的SixLaborsImageHelper.BuildVerifyCode函数,生成的验证码图片被编码为base64字符串,连同验证码及验证码标识一并发送给客户端。验证码也保存在服务端的缓存内,有2分钟的时效性。

SixLaborsImageHelper.BuildVerifyCode函数内部调用SixLabors包相关类及函数生成验证码图形,其主要生成验证码的逻辑如下所示:
1)根据配置文件的Captcha节配置初始化图形对象及字体;
2)根据配置文件的Captcha节配置的KeyLength决定验证码内容形式,如果KeyLength大于0,则调用CreateValidateCode函数生成KeyLength长度的数字字符串,否则随机生成10以内的加减乘运算字符串;
3)生成验证码内容后,先填充图片背景色,在逐字符绘制验证码内容,每个字符的颜色随机,位置从左向右绘制;
4)绘制6条干扰线,干扰线的颜色和位置都随机,然后再绘制60个噪点,噪点为颜色随机、位置随机、x和y方向长度均为1的线段;
5)将生成的图片以jpg格式的字节数组返回Captcha函数。

CreateValidateCode函数用于生成指定长度的数字字符串(长度为length),其主要实现逻辑为:
1)先生成length个不同的种子值,保存在seeks数组中;
2)再根据种子值生成length个随机数字,保存在randMembers数组中,每个数字的值在10的length次方至Int32.MaxValue之间;
3)从randMembers数组的每个数字中随机取一位数字保存到validateNums数组中;
4)将validateNums数字逐个拼接位数字字符串后返回。

参考文献:
1\]https://github.com/xianhc/ape-volo-web \[2\]https://github.com/xianhc/ape-volo-admin \[3\]http://doc.apevolo.com/ \[4\]https://cn.vuejs.org/