转:http://www.cnblogs.com/liuxiaoji/p/4920382.html

网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录、灌水等危害网站的操作。验证码被广泛应用在注册、登录、留言等提交信息到服务器端处理的页面中。

在ASP.NET网站中应用验证码是很容易的,网上有很多的解决方案。最近在做一个OA项目,因系统采用的ASP.NET MVC框架,同样在登录页中需用到验证码,故需将原来在ASP.NET网站中使用的验证码移植到ASP.NET MVC中。

    原ASP.NET网站用来生成验证码的类文件ValidateCode.cs:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.UI;
using System.Drawing.Drawing2D;
using System.IO;namespace SeniOA.MVC
{/// <summary>/// 生成验证码的类/// </summary>public class ValidateCode{public ValidateCode(){}/// <summary>/// 验证码的最大长度/// </summary>public int MaxLength{get { return 10; }}/// <summary>/// 验证码的最小长度/// </summary>public int MinLength{get { return 1; }}/// <summary>/// 生成验证码/// </summary>/// <param name="length">指定验证码的长度</param>/// <returns></returns>public string CreateValidateCode(int length){int[] randMembers = new int[length];int[] validateNums = new int[length];string validateNumberStr = "";//生成起始序列值int seekSeek = unchecked((int)DateTime.Now.Ticks);Random seekRand = new Random(seekSeek);int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);int[] seeks = new int[length];for (int i = 0; i < length; i++){beginSeek += 10000;seeks[i] = beginSeek;}//生成随机数字for (int i = 0; i < length; i++){Random rand = new Random(seeks[i]);int pownum = 1 * (int)Math.Pow(10, length);randMembers[i] = rand.Next(pownum, Int32.MaxValue);}//抽取随机数字for (int i = 0; i < length; i++){string numStr = randMembers[i].ToString();int numLength = numStr.Length;Random rand = new Random();int numPosition = rand.Next(0, numLength - 1);validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));}//生成验证码for (int i = 0; i < length; i++){validateNumberStr += validateNums[i].ToString();}return validateNumberStr;}/// <summary>/// 创建验证码的图片/// </summary>/// <param name="containsPage">要输出到的page对象</param>/// <param name="validateNum">验证码</param>public void CreateValidateGraphic(string validateCode){Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色
                g.Clear(Color.White);//画图片的干扰线for (int i = 0; i < 25; i++){int x1 = random.Next(image.Width);int x2 = random.Next(image.Width);int y1 = random.Next(image.Height);int y2 = random.Next(image.Height);g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);}Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图片的前景干扰点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//画图片的边框线g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);//保存图片数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图片流
                containsPage.Response.Clear();containsPage.Response.ContentType = "image/jpeg";containsPage.Response.BinaryWrite(stream.ToArray());}finally{g.Dispose();image.Dispose();}}/// <summary>/// 得到验证码图片的长度/// </summary>/// <param name="validateNumLength">验证码的长度</param>/// <returns></returns>public static int GetImageWidth(int validateNumLength){return (int)(validateNumLength * 12.0);}/// <summary>/// 得到验证码的高度/// </summary>/// <returns></returns>public static double GetImageHeight(){return 22.5;}}
}

View Code

为适合ASP.NET MVC框架,修改其输出图片流的方法CreateValidateGraphic为:

/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="containsPage">要输出到的page对象</param>
/// <param name="validateNum">验证码</param>
public byte[] CreateValidateGraphic(string validateCode)
{Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色
        g.Clear(Color.White);//画图片的干扰线for (int i = 0; i < 25; i++){int x1 = random.Next(image.Width);int x2 = random.Next(image.Width);int y1 = random.Next(image.Height);int y2 = random.Next(image.Height);g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);}Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图片的前景干扰点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//画图片的边框线g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);//保存图片数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图片流return stream.ToArray();}finally{g.Dispose();image.Dispose();}
}

View Code

在Controller.cs中,添加Action,用来设置将生成的验证码存入Session,并输出验证码图片:

public ActionResult GetValidateCode()
{ValidateCode vCode = new ValidateCode();string code = vCode.CreateValidateCode(5);Session["ValidateCode"] = code;byte[] bytes = vCode.CreateValidateGraphic(code);return File(bytes, @"image/jpeg");
}

View Code

调用方式为:在需要使用验证码的页面中,加入<img>标签:
<img id="valiCode" src="../Account/GetValidateCode" alt="验证码" />

到于Account/Login这个Action中的处理,只需加入对Session中验证码的判断:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string userName, string password, bool rememberMe, string returnUrl,string code)
{if (Session["ValidateCode"].ToString() != code){ModelState.AddModelError("code", "validate code is error");return View();}//此处验证用户名、密码if (!ValidateLogOn(userName, password)){return View();}//验证成功
    FormsAuthentication.SetAuthCookie(userName, rememberMe);if (!String.IsNullOrEmpty(returnUrl)){return Redirect(returnUrl);}else{return RedirectToAction("Index", "Home");}
}

View Code

为实现登录页中,点击图片切换验证码,可以登录页中加入此JS代码实现刷新验证码:

<script type="text/javascript" src="http://www.cnblogs.com/Scripts/jquery-1.3.2-vsdoc.js"></script>
<script type="text/javascript">$(function() {$("#valiCode").bind("click", function() {this.src = "../Account/GetValidateCode?time=" + (new Date()).getTime();});//alert("good");
    });
</script>

View Code

转载于:https://www.cnblogs.com/love201314/p/4922888.html

ASP.NET MVC实现网站验证码功能相关推荐

  1. ASP.NET.MVC实现网站验证码功能

    开发工具与关键技术:Visual Studio 2015 生成验证码 作者:孙水兵 撰写时间:2019年5月7 一.为什么网站要用到验证码 因为WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手 ...

  2. 为ASP.NET MVC扩展异步Action功能(下)

    本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...

  3. [.NET][ASP.NET MVC 5 网站开发之美]书籍内容介绍及pdf下载

    ASP.NET MVC是微软Web开发平台中最重要的一块拼图,其架构特性更适合用来开发大型的Web应用程序,且ASP.NET MVC的开发方式也越来越受到重视,因此学习MVC已是刻不容缓. 由demo ...

  4. ASP.NET MVC 学习网站

    1.微软官方 官方网站 www.asp.net/mVC ASP.NET MVC QuickStart文档.http://quickstarts.asp.net/previews/mvc/ 视频教程(M ...

  5. asp.net mvc 简易上传功能

    1.上传图片页面 VIEW <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> ...

  6. ASP.NET MVC商城网站后台管理系统

    本项目使用了大量的插件,所有的商品数据皆为动态加载,全部从数据库中读取呈现在界面上,具备商品管理.用户管理等功能,还可查看商品的相关数据汇总.本项目对应的网上商城在上一篇文章中. 界面展示(部分) 代 ...

  7. ASP.NET MVC 微博网站--获取关注的人的微博和我的微博

    总代码如下: public ActionResult GetNoticeBC() {GDCPSIMEntities dc = new GDCPSIMEntities();dc.Configuratio ...

  8. 【转】asp.net mvc生成验证码

    ASP.NET MVC实现网站验证码功能 网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录. ...

  9. [转]Asp.net mvc 网站之速度优化 -- 页面缓存

    网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 - 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...

  10. 总结一下ASP.NET MVC 网站的部署问题

    近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到IIS上去? 现在我的系统是Windows 7,II ...

最新文章

  1. 最终章|一分钟详解PCL编译过程
  2. 实施Service Mesh前,你需要考虑这几个问题
  3. CIC抽取插值滤波器和RCF
  4. Oracle数据库备份与还原命令
  5. 8、Semantic-UI之其他按钮样式
  6. sqlserver excel,txt,access等文件的互導
  7. 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)
  8. 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
  9. PHP环境搭配(二):lamp(linux+apache+mysql+php)搭建,附moodle与onlinejudge配置
  10. Hadoop笔记整理(二):HDFS
  11. graphpad折线图教程_GraphPad Prism 8.0绘制误差连线并填充颜色图
  12. python批量修改文件内容(修改文件指定行)
  13. 多个模型融合训练神经网络-devise模型的实现
  14. 淘宝店铺运营,店铺访客增加但是浏览量减少这是为什么,应该怎样解决?
  15. 高清车牌识别系统无法连接服务器,智能停车场高清车牌识别系统,常见的故障及解决方法!...
  16. 手机型号云服务器,手机型号云服务器
  17. 用python输出圣诞树_教你怎样用Python画了一棵圣诞树,赶紧来学习
  18. matlab plot大小,Matlab 修改plot大小
  19. VirtualBox复制虚拟机(同电脑、跨电脑)
  20. 猿圈 题库_百度传课携手猿圈 接入题库及测评服务

热门文章

  1. java 实现订单合并_向高手进阶,从 0 开始手写实现一个 RPC 框架!
  2. Java线程池ThreadPoolExecutor使用与解析
  3. 厉害了我的Qunar!看我工程师写轮眼!
  4. 从中煤陕西公司看政企移动信息化应用
  5. 售前更需要关注客户业务
  6. 组建Forefront TMG独立陈列(上)-案例介绍与服务器准备
  7. 深入了解 HTML 5
  8. 对应点集配准的四元数法(ICP算法中的一个关键步骤)
  9. RFC 793翻译(TCP的主体内容)
  10. postgresql-窗口函数使用