当前位置: 首页 > news >正文

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

相关文章:

  • 【c语言】统计一个数字在排序数组中出现的次数
  • CentOS 下安装testlink
  • 历史记录
  • crack-jar游戏之CP9
  • SQLAlchemy -- Python的ORM驱动
  • console.log()注意事项。
  • NM常用网络命令
  • 点击手机号,跳转到手机打电话
  • BUS Matrix
  • 记前端小白入门15天
  • 大约 C++ 几个方面分析--overload, override, overwrite, rewrite
  • 字典类型的字符串转成字典
  • Aspose.Words 最新版发布【附下载】
  • go log包
  • C# 并行计算(Parallel 和 ParallelQuery)
  • 《深入 React 技术栈》
  • Angular 2 DI - IoC DI - 1
  • Angular6错误 Service: No provider for Renderer2
  • CSS实用技巧干货
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6系列(二)变量的解构赋值
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • oldjun 检测网站的经验
  • PAT A1092
  • Solarized Scheme
  • spring boot 整合mybatis 无法输出sql的问题
  • TCP拥塞控制
  • 测试开发系类之接口自动化测试
  • 第十八天-企业应用架构模式-基本模式
  • 力扣(LeetCode)965
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用SAX解析XML
  • 阿里云服务器购买完整流程
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​低代码平台的核心价值与优势
  • #QT(一种朴素的计算器实现方法)
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (bean配置类的注解开发)学习Spring的第十三天
  • (初研) Sentence-embedding fine-tune notebook
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (简单) HDU 2612 Find a way,BFS。
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原)本想说脏话,奈何已放下
  • (转)Mysql的优化设置
  • *1 计算机基础和操作系统基础及几大协议
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net core Swagger 过滤部分Api