ASP.NET 5探险(8):利用中间件、TagHelper来在MVC 6中实现Captcha

(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

题记:由于ASP.NET 5及MVC 6是一个微软全新重新的Web开发平台,之前一些现有的验证码库已经不能直接使用,故而我自行实现了一套简单的验证码库——CaptchaMVC6。

CaptchaMVC6我已经开源到GitHub上(同时提供了使用范例给大家参考),大家可以通过“阅读原文”来访问项目页面。

CaptchaMVC6虽然一些核心的一些算法和现有的验证码库没有本质区别,不过整个封装方式充分利用了ASP.NET 5和MVC 6的新特性:

  • 使用ASP.NET 5中间件来实现验证码图片的渲染,之前常见的方式一般采用HttpHandler、HttpModule或者直接使用ASP.NET MVC的控制器。相关代码见:CaptchaMiddleware.cs、CaptchaMiddlewareExtensions.cs
  • 基于TagHelper简化视图中的处理。比如显示验证码图片,常规做法是约定一个地址,并在img元素中直接给src设定服务端验证码图片渲染地址。而通过TagHelper,只需要在img元素中添加一个自定义属性即可。另外,也通过TagHelper来控制验证码要不要显示(见下)。相关代码见:CaptchaTagHelper.cs
  • 基于ASP.NET 5的依赖注入机制,可以方便替换验证码生成算法(当然我也提供了一个简单的默认算法)。相关代码见:CaptchaServiceCollectionExtensions.cs、DefaultCodeGenerator.cs、DefaultGraphicGenerator.cs

除了上面的这些利用新特性的地方,CaptchaMVC6还有额外的两个特点:

  1. 基于ValidationAttribute来封装在服务端对验证码有效性的算法,即要验证有效性只需要给视图模型附加一个标记。相关代码见:CaptchaAttribute.cs
  2. 实现了简单的验证码是否启用的控制机制(通过Session来记录是否要开启)。相关代码见:CaptchaControlTagHelper.cs

在使用范例中,我演示了两种使用场景:

  1. 注册的时候,必须输入验证码方能完成注册。相关代码见:AccountViewModels.cs中的RegisterViewModel类、Register.cshtml
  2. 登录的时候,一开始可以不用输入验证码,如果出错两次后,就要输入验证码。相关代码见:AccountViewModels.cs中的LoginViewModel类、Login.cshtml、AccountController.cs中的Login方法

需要注意的是,由于CaptchaMVC6使用到了System.Drawing这个程序集,所以暂时无法运行在dnxcore50之上,即无法跨平台。并且这个还是一个最初的版本,需要完善的地方还有很多。另外,我接下来也会尽快提供Nuget包,供大家方便使用。

项目地址:https://github.com/heavenwing/CaptchaMVC6

时间: 2024-12-28 16:34:18

ASP.NET 5探险(8):利用中间件、TagHelper来在MVC 6中实现Captcha的相关文章

ASP.net 资源请求漏洞利用工具PadBuster

ASP.net 资源请求漏洞利用工具PadBuster 在ASP.net 网站中,为了便于部署网站项目,开发者往往会将资源(图片.Javascript文件)嵌入到dll文件中.而网页中,会使用WebResource.axd?d=XXX的形式请求资源.其中,XXX采用CBC-R加密的方式生成的访问密钥.由于CBC-R算法存在Padding Oracle漏洞,所以导致渗透人员可以非法访问网站敏感文件,如web.config.PadBuster是Kali Linux提供的一款专向工具.该工具使用Per

ASP.NET 5探险(3):使用UMEditor并实现图片上传

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天将继续上一篇来讲解百度富文本Web编辑器UEditor或UMEditor的使用. 上一篇"ASP.NET 5探险",我给大家分享了如何在ASP.NET 5中实现文件上传.我之所以研究这一问题的原因,就是要在百度的百度富文本Web编辑器UMEditor中实现图片上传.那么今天我们回过头来看看如何在ASP.NET 5的MVC 6项目中使用UMEditor(UEditor的使

ASP.NET Core解说之Middleware(中间件)

一.什么是中间件 中间件是汇集到以处理请求和响应的一个应用程序管道的软件. 每个组件: 可以选择是否要将请求传递到管道中的下一个组件. 可以在请求管道的下一个组件调用之前和之后执行相关业务操作. 二.使用 IApplicationBuilder 创建中间件管道 ASP.NET Core请求管道由一系列请求委托组成,这些请求委托按序一个接一个被调用,如图所示的顺序组成(按照黑色箭头的顺序执行): 每个委托可以执行相关操作在下一个委托的之前和之后. 委托还可以决定不将请求传递给委托链的下一个委托(我

ASP.NET 5探险(2):上传文件

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在ASP.NET 5(MVC 6)中处理上传文件的方式和之前有所不同. 在MVC 5之前的版本中上传文件,有两种方式. 1,直接对Request.Files进行访问获取HttpPostedFileBase,如下面代码所示: [HttpPost] public ActionResult Upload() { string path = @"D:\Temp\"; HttpPos

nodejs+express中利用中间件提高代码复用

在用nodejs+express+mysql做后台时,有很多涉及到用户信息的请求都要先判断请求中的token(用户名+时间戳+随机数采用sha1加密得到的随机字符串)是否有效. 一开始是在每个请求的处理中都加入了对token的判断.(写了n遍,脑袋抽了) 代码如下: //修改项目的状态 router.post('/change-project',validToken,function(req,res,next){ var db = req.db; var token = req.query.to

ASP.NET 5探险(6):升级ASP.NET 5到beta6

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软根据ASP.NET 5的路线图如期发布了beta6,现在我们就来说说beta5升级到beta6的一些问题. 之前微软公布了ASP.NET 5的路线图 (https://github.com/aspnet/home/wiki/roadmap).根据这个路线图的说法,在7月27日发布ASP.NET 5 beta6.由于微软是7月20日发布Visual Studio 2015 RTM的(内置AS

ASP.NET MVC 3中的路由

准备发布新随笔,才发现草稿里还有几年前这篇烂了尾的,先放上来,有空再补完整吧-- (* 整理自<Pro ASP.NET MVC 3 Framework>学习笔记. *) 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成

[转]在 ASP.NET MVC 4 中创建为移动设备优化的视图

原文链接 https://msdn.microsoft.com/zh-cn/magazine/dn296507.aspx 如果深入探讨有关编写移动设备网站的常识性考虑因素,会发现其中有一种内在矛盾. 一方面,客户在其编写应用程序和网站的方法中强烈要求(或乐于要求)移动优先. 另一方面,同一些人又经常称赞 CSS 媒体查询和流体布局. 我所发现的矛盾在于经常利用 CSS 媒体查询和流体布局并未在其他内容之前优先处理移动方面,它不是一种移动优先的方法. 在本文中,我将介绍如何使用服务器端逻辑为给定设

ASP.NET MVC 4 中的JSON数据交互

前台Ajax请求很多时候需要从后台获取JSON格式数据,一般有以下方式: 拼接字符串 return Content("{\"id\":\"1\",\"name\":\"A\"}"); 为了严格符合Json数据格式,对双引号进行了转义. 使用JavaScriptSerialize.Serialize()方法将对象序列化为JSON格式的字符串 MSDN 例如我们有一个匿名对象: var tempObj=new