.Net Core Session验证码

1、验证码帮助类

复制代码
namespace IdeaCore.Services.Common
{
    public class ValidateCodeService : IValidateCodeService
    {
        private const string ValidateCodeKey = "ValidateCode";
        private const double Pi2 = 6.283185307179586476925286766559;
        private const string BackColor = "#dde3ec";

        /// <summary>
        /// 获取验证码的sessionkey
        /// </summary>
        /// <returns></returns>
        public string GetValidateCodeKey() {
            return ValidateCodeKey;
        }

        /// <summary>
        /// 生成验证码
        /// </summary>
        /// <param name="length"></param>
        /// <returns></returns>
        public string CreateValidateCode(int length)
        {
            string code = string.Empty;

            while (true)
            {
                var s = (Guid.NewGuid() + "").Substring(0, 1);
                if (s == "1" || s == "l" || s == "o" || s == "0")
                {

                }
                else
                {
                    code += s;
                }

                if (code.Length >= length)
                {
                    break;
                }
            }
            return code;
        }

        /// <summary>
        /// 创建验证码的图片
        /// </summary>
        /// <param name="validateCode">验证码</param>
        public byte[] CreateValidateGraphic(string validateCode)
        {
            const int fSize = 40;
            const int fWidth = fSize + 8;

            int imageWidth = validateCode.Length * fWidth + 4 + 8 * 2;
            const int imageHeight = fSize * 2 + 8;

            Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
            string[] fonts = { "Arial", "Georgia" };

            var image = new Bitmap(imageWidth, imageHeight);
            Graphics g = Graphics.FromImage(image);
            try
            {
                g.Clear(ColorTranslator.FromHtml(BackColor));
                var rand = new Random();

                给背景添加随机生成的燥点
                //Pen pen = new Pen(Color.RoyalBlue, 0);
                //    int c = 6 * 20; //杂点数量
                //    for (int i = 0; i < c; i++)
                //    {
                //        int x = rand.Next(image.Width);
                //        int y = rand.Next(image.Height);
                //        g.DrawRectangle(pen, x, y, 1, 1);
                //    }

                const int n1 = (imageHeight - 40 - 8 * 2);
                const int n2 = n1 / 4;
                const int top1 = n2;
                const int top2 = n2 * 2;

                //随机字体和颜色的验证码字符
                for (int i = 0; i < validateCode.Length; i++)
                {
                    int cindex = rand.Next(colors.Length - 1);
                    int findex = rand.Next(fonts.Length - 1);

                    var f = new Font(fonts[findex], fSize, FontStyle.Bold);
                    Brush b = new SolidBrush(colors[cindex]);

                    var top = i % 2 == 1 ? top2 : top1;

                    var left = i * fWidth;
                    if (i == 0) { left += 8; }

                    g.DrawString(validateCode.Substring(i, 1), f, b, left, top);
                }
                //
                image = TwistImage(image, true, new Random().Next(3, 10), new Random().Next(0, 6));

                var stream = new MemoryStream();
                image.Save(stream, ImageFormat.Jpeg);
                //输出图片流
                return stream.ToArray();
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }



        #region 产生波形滤镜效果

        /// <summary>
        /// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
        /// </summary>
        /// <param name="srcBmp">图片路径</param>
        /// <param name="bXDir">如果扭曲则选择为True</param>
        /// <param name="dMultValue"></param>
        /// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
        /// <returns></returns>
        private static Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
        {
            var destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);

            // 将位图背景填充为白色
            var graph = Graphics.FromImage(destBmp);
            graph.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(BackColor)), 0, 0, destBmp.Width, destBmp.Height);
            graph.Dispose();

            double dBaseAxisLen = bXDir ? destBmp.Height : destBmp.Width;

            for (int i = 0; i < destBmp.Width; i++)
            {
                for (int j = 0; j < destBmp.Height; j++)
                {
                    var dx = bXDir ? (Pi2 * j) / dBaseAxisLen : (Pi2 * i) / dBaseAxisLen;
                    dx += dPhase;
                    var dy = Math.Cos(dx);

                    // 取得当前点的颜色
                    int nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
                    int nOldY = bXDir ? j : j + (int)(dy * dMultValue);

                    var color = srcBmp.GetPixel(i, j);
                    if (nOldX >= 0 && nOldX < destBmp.Width
                     && nOldY >= 0 && nOldY < destBmp.Height)
                    {
                        destBmp.SetPixel(nOldX, nOldY, color);
                    }
                }
            }

            return destBmp;
        }
        #endregion
    }
}
复制代码

2、获取验证码

复制代码
/// <summary>
/// 获取验证码
/// </summary>
/// <returns></returns>
public FileContentResult GetValidateCode()
{
    var code = _validateCodeService.CreateValidateCode(4);
    var bytes = _validateCodeService.CreateValidateGraphic(code);
    HttpContext.Session.SetString(_validateCodeService.GetValidateCodeKey(), code);
    return File(bytes, @"image/jpeg");
}
复制代码

3、验证验证码

复制代码
/// <summary>
/// 验证验证码
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
protected bool ValidateCode(string code) {
    if (string.IsNullOrEmpty(code)) {
        return false;
    }

    var sessionCode = HttpContext.Session.GetString("ValidateCode");
    return sessionCode != null && sessionCode == code.Trim();
}
复制代码

 

 
分类:  .Net Core

 

 

转载于:https://www.cnblogs.com/webenh/p/11597606.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值