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(, );
if (s == "" || s == "l" || s == "o" || s == "")
{ }
else
{
code += s;
} if (code.Length >= length)
{
break;
}
}
return code;
} /// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="validateCode">验证码</param>
public byte[] CreateValidateGraphic(string validateCode)
{
const int fSize = ;
const int fWidth = fSize + ; int imageWidth = validateCode.Length * fWidth + + * ;
const int imageHeight = fSize * + ; 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 - - * );
const int n2 = n1 / ;
const int top1 = n2;
const int top2 = n2 * ; //随机字体和颜色的验证码字符
for (int i = ; i < validateCode.Length; i++)
{
int cindex = rand.Next(colors.Length - );
int findex = rand.Next(fonts.Length - ); var f = new Font(fonts[findex], fSize, FontStyle.Bold);
Brush b = new SolidBrush(colors[cindex]); var top = i % == ? top2 : top1; var left = i * fWidth;
if (i == ) { left += ; } g.DrawString(validateCode.Substring(i, ), f, b, left, top);
}
//
image = TwistImage(image, true, new Random().Next(, ), new Random().Next(, )); 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)), , , destBmp.Width, destBmp.Height);
graph.Dispose(); double dBaseAxisLen = bXDir ? destBmp.Height : destBmp.Width; for (int i = ; i < destBmp.Width; i++)
{
for (int j = ; 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 >= && nOldX < destBmp.Width
&& nOldY >= && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
} return destBmp;
}
#endregion
}
}

2、获取验证码

/// <summary>
/// 获取验证码
/// </summary>
/// <returns></returns>
public FileContentResult GetValidateCode()
{
var code = _validateCodeService.CreateValidateCode();
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 Session验证码的更多相关文章

  1. 网站启动SSL, http变为https后,session验证码错误解决方法

    网站启动SSL, http变为https后,session验证码错误解决方法   最近公司需要后台启动安全证书,证书安装完毕后,后台老提示 验证码错误,经过几天的研究,此问题已经得到有效解决,现把方法 ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用

    asp.net core session的使用   Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core ...

  3. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  4. .net core session部分浏览器或移动客户端不可用

    .net core session使用有很多文章,这里不再赘述. 问题现象为大部分浏览器或者移动客户端(例如微信.支付宝.钉钉)等都可以正常使用.但部分支付宝用户及钉钉用户确无法使用. 写入后读取不到 ...

  5. asp.net core session丢失问题排查

    最近公司采用asp.net core的站点在外测环境中,总是发现存在session丢失的情况.排查了好久,客户端.AspNetCore.Session的cookie未丢失,session的分布式缓存采 ...

  6. .NET Core Session的简单使用

    前言 在之前的.NET 里,我们可以很容易的使用Session读取值.那今天我们来看看 如何在.NET Core中读取Session值呢? Session 使用Session之前,我们需要到Start ...

  7. asp.net core 图片验证码,后台验证

    验证方法: public static string VerificationCodeCacheFormat="vcode_cache_{0}"; public IActionRe ...

  8. .NET Core Session的使用方法

    刚使用.NET Core会不习惯,比如如何使用Session:不仅需要引用相应的类库,还需要在Startup.cs里进行注册. 1.在你的项目上基于NuGet添加: install-package M ...

  9. asp.net core session的使用

    Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core 1.0好像需要单独安装,在nuget控制台,选择你 ...

随机推荐

  1. 浅谈javascript中stopImmediatePropagation函数和stopPropagation函数的区别

    在事件处理程序中,每个事件处理程序中间都会有一个event对象,而这个event对象有两个方法,一个是stopPropagation方法,一个是stopImmediatePropagation方法,两 ...

  2. 今天学习的裸板驱动之GPIO实验学习心得

    GPIO分成很多组今天学习的这个芯片的GPIO有GPA-GPJ个组.具体可在芯片手册中看到. GPIO有很多寄存器,今天学习的这个芯片,他的寄存器分为以下几种类型: (1)端口控制寄存器 (2)端口数 ...

  3. jquery.ajax异步发送请求的简单测试

    使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...

  4. 当页面加载完成时,JQ触发添加页面的元素的事件触发不了。。

    有下代码可知: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  5. java中的反编译

    使用JD-GUI工具  支持mac os 和 windows  地址为:http://jd.benow.ca

  6. 笔记本光驱位安装固态硬盘及window系统一些过程记录

    自己的笔记本电脑是13年买的  联想G480 i3  32位 2g内存,配置有点低,呵呵.当初刚毕业问家里要钱买的,到现在后悔没有买好一点的笔记本. 用着用着感觉内存不够用,网上就买了根内存条,买之前 ...

  7. c#弱事件(weak event)

    传统事件publisher和listener是直接相连的,这样会对垃圾回收带来一些问题,例如listener已经不引用任何对象但它仍然被publisher引用 垃圾回收器就不能回收listener所占 ...

  8. 坑爹的 Hardware Reserved Memory (查看内存等)

    来源: http://blog.sina.com.cn/s/blog_772645ff0100s4t7.html 我的电脑是GatewayNV49C83c,酷睿i3的CPU和NV的独立显卡 Inter ...

  9. Specified key was too long; max key length is 767 b

    alter table - engine=innodb,row_format=dynamic; Specified key was too long; max key length is 767 b

  10. Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能

    这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l)  给JButton添加一个鼠标点击监听器l ...