(此文章同时发表在本人微信公众号“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

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

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

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天将继续上一篇来讲解百度富文本Web编辑器UEditor或UMEditor的使用. ...

  2. Asp.Net Core 轻松学-利用文件监视进行快速测试开发

    前言     在进行 Asp.Net Core 应用程序开发过程中,通常的做法是先把业务代码开发完成,然后建立单元测试,最后进入本地系统集成测试:在这个过程中,程序员的大部分时间几乎都花费在开发.运行 ...

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

    ASP.net 资源请求漏洞利用工具PadBuster 在ASP.net 网站中,为了便于部署网站项目,开发者往往会将资源(图片.Javascript文件)嵌入到dll文件中.而网页中,会使用WebR ...

  4. ASP.NET Core 2.2在中间件内使用有作用域的服务

    服务生存期 为每个注册的服务选择适当的生存期.可以使用以下生存期配置ASP.NET Core服务: 暂时 暂时生存期服务 (AddTransient) 是每次从服务容器进行请求时创建的. 这种生存期适 ...

  5. Asp.Net Core入门之自定义中间件

    什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...

  6. asp.net core 3.1 自定义中间件实现jwt token认证

    asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...

  7. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端

    配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...

  8. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源

    配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...

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

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软根据ASP.NET 5的路线图如期发布了beta6,现在我们就来说说beta5升级 ...

随机推荐

  1. mysql索引无效且sending data耗时巨大原因分析

    一朋友最近新上线一个项目,本地测试环境跑得好好的,部署到线上却慢得像蜗牛一样.后来查询了一下发现一个sql执行了16秒,有些长的甚至80秒.本地运行都是毫秒级别的查询.下面记录一下困扰了两天的,其中一 ...

  2. mysql开启binlog

    mysql开启binlog,至于为什么要开启binlog,可以google下. ## 设置server_id,一般设置为IP server_id= ## 复制过滤:需要备份的数据库名,多个库以逗号分隔 ...

  3. SAP系统更改小数点显示问题

    在SAP系统中会出现小数点显示的问题,比如123.12,正常情况下是这样显示,但SAP系统是德国的出的系统,德国的书写数字的习惯是将小数点“.”写成“,”逗号,显示为:123,12 这个问题可以使用事 ...

  4. springmvc多文件上传

    @RequestMapping(value = "/upload", method = RequestMethod.POST) public void upload(@Reques ...

  5. SpringMVC,3种不同的URL路由配置方法(这根本不是一个小问题)

    转载自:http://blog.csdn.net/fansunion/article/details/41149287?utm_source=tuicool&utm_medium=referr ...

  6. 【leetcode】 Longest Valid Parentheses (hard)★

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  7. 【leetcode】Restore IP Addresses (middle)

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  8. 真机测试无缘无故finish了。程序也没有启动

    去钥匙串里边把多余的证书删除, 然后reset xcode - preference - 选中你的appleID - iOS Development  -  reset

  9. IOS - 多态

    1. 多态性 多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式.或者说相同的名字,不同的类.我们来看一个书上的示例: #import  ...

  10. VS工程目标文件名设置

    默认的输出文件名是$(ProjectName) 可以在项目属性-配置属性-常规-目标文件名中设置 例如我想在Debug版本的输出文件加一个后缀d,那么我可以这样设置:$(ProjectName)d