时间 2016-03-02 18:22:37 smallerpig
 

geetest开发体验,写一下快速搭建geetst的步骤(极简模式) 
首先,我们去geetest注册一个账号 ,拿到验证所需的captcha_id和private_key(不想注册的同学可以使用下面提供测试id和key)

captcha_id:b46d1900d0a894591916ea94ea91bd2c

private_key:36fc3fe98530eea08dfc6ce76e3d24c4

我们一般在做项目时为了保证提交的数据是真实用户数据而非机器人提交一般都会添加验证码操作来让用户在提交表单的同时填上服务端生成的验证码,这样在一定程度上能够防止暴力提交或者暴力破解。但是却在一定程度上增加了开发的成本。

现在的互联网上各种产品都能够独立开发使用,今天小猪就为大家介绍 极验验证 这个工具。

目前网络中已经可以发现大量使用该产品的应用,用户只需简单的滑动滑块来进行验证( 体验地址 ),一定程度上提高了用户体验。

极验官方提供了C#版本的服务端 SDK 。并且提供了一个简单的 DEMO 。可惜该DEMO是Web Form版本的。而目前大家使用的比较多的是ASP.NET MVC项目,所以今天小猪就在其官方DEMO的基础上改成了ASP.NET MVC项目。

  • 新建ASP.NET MVC项目,并在项目中引用C#版本的SDK。
  • 申请极验账号并添加验证。如图:
    成功添加后我们可以看到对应的ID和KEY。
  • 新建测试控制器 AccountController

  • 在控制器中随意添加一个Action,例如Login
  • 在对应的View里添加代码(例如Login.cshtml):
  1. <div id="geetest-container">
  2.  
  3. </div>
  4. <script src="http://static.geetest.com/static/tools/gt.js"></script>
  5.  
  6. <script>
  7. window.addEventListener('load',processGeeTest);
  8.  
  9. function processGeeTest() {
  10. $.ajax({
  11. // 获取id,challenge,success(是否启用failback)
  12. url: "/Account/GeekTest",
  13. type: "get",
  14. dataType: "json", // 使用jsonp格式
  15. success: function (data) {
  16. // 使用initGeetest接口
  17. // 参数1:配置参数,与创建Geetest实例时接受的参数一致
  18. // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
  19. initGeetest({
  20. gt: data.gt,
  21. challenge: data.challenge,
  22. product: "float", // 产品形式
  23. offline: !data.success
  24. }, handler);
  25. }
  26. });
  27. }
  28.  
  29. var handler = function (captchaObj) {
  30. // 将验证码加到id为captcha的元素里
  31. captchaObj.appendTo("#geetest-container");
  32.  
  33. captchaObj.onSuccess = function(e) {
  34. console.log(e);
  35. }
  36.  
  37. };
  38. </script>
  1.     <divid="geetest-container">
  2.  
  3.     </div>
  4.     <scriptsrc="http://static.geetest.com/static/tools/gt.js"></script>
  5.  
  6.     <script>
  7.         window.addEventListener('load',processGeeTest);
  8.  
  9.         function processGeeTest() {
  10.             $.ajax({
  11.                 // 获取id,challenge,success(是否启用failback)
  12.                 url: "/Account/GeekTest",
  13.                 type: "get",
  14.                 dataType: "json", // 使用jsonp格式
  15.                 success: function (data) {
  16.                     // 使用initGeetest接口
  17.                     // 参数1:配置参数,与创建Geetest实例时接受的参数一致
  18.                     // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
  19.                     initGeetest({
  20.                         gt: data.gt,
  21.                         challenge: data.challenge,
  22.                         product: "float", // 产品形式
  23.                         offline: !data.success
  24.                     }, handler);
  25.                 }
  26.             });
  27.         }
  28.  
  29.         var handler = function (captchaObj) {
  30.             // 将验证码加到id为captcha的元素里
  31.             captchaObj.appendTo("#geetest-container");
  32.  
  33.             captchaObj.onSuccess = function(e) {
  34.                 console.log(e);
  35.             }
  36.  
  37.         };
  38.     </script>
  39.  

上述代码中使用了JQuery库,需要同时引用。其中我们使用Ajax来动态请求后台AccountController的GeeTest方法,代码如下:

  1. public ActionResult GeekTest()
  2. {
  3. string result = getCaptcha();
  4.  
  5. return Content(result, "application/json");
  6. }
  7.  
  8. private String getCaptcha()
  9. {
  10. GeetestLib geetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
  11. Byte gtServerStatus = geetest.preProcess();
  12. Session[GeetestLib.gtServerStatusSessionKey] = gtServerStatus;
  13. return geetest.getResponseStr();
  14. }
  1. public ActionResultGeekTest()
  2. {
  3.     string result = getCaptcha();
  4.  
  5.     return Content(result, "application/json");
  6. }
  7.  
  8.  
  9. private String getCaptcha()
  10. {
  11.     GeetestLibgeetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
  12.     Byte gtServerStatus = geetest.preProcess();
  13.     Session[GeetestLib.gtServerStatusSessionKey] = gtServerStatus;
  14.     return geetest.getResponseStr();
  15. }
  16.  

上述代码中的 geetest_publicKeygeetest_privateKey 分别对应极验后台申请到的ID和KEY。

这样我们就可以运行程序看到效果。接下来的工作就是确认用户在提交对应的表单的时候有没有通过极验的验证了。

在接受表单提交的POST地址里面输入代码,例如:

  1. //
  2. // POST: /Account/Login
  3. [HttpPost]
  4. [AllowAnonymous]
  5. [ValidateAntiForgeryToken]
  6. public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
  7. {
  8. if (!CheckGeeTestResult())
  9. {
  10. ModelState.AddModelError("", "请先完成验证操作。");
  11. return View(model);
  12. }
  13. if (!ModelState.IsValid)
  14. {
  15. return View(model);
  16. }
  17.  
  18. //其他验证逻辑
  19. ...
  20. }
  21. }
  22.  
  23. private bool CheckGeeTestResult()
  24. {
  25. GeetestLib geetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
  26. Byte gt_server_status_code = (Byte)Session[GeetestLib.gtServerStatusSessionKey];
  27. String userID = (String)Session["userID"];
  28.  
  29. int result = 0;
  30. String challenge = Request.Form.Get(GeetestLib.fnGeetestChallenge);
  31. String validate = Request.Form.Get(GeetestLib.fnGeetestValidate);
  32. String seccode = Request.Form.Get(GeetestLib.fnGeetestSeccode);
  33. if (gt_server_status_code == 1) result = geetest.enhencedValidateRequest(challenge, validate, seccode, userID);
  34. else result = geetest.failbackValidateRequest(challenge, validate, seccode);
  35. if (result != 1) return false;
  36.  
  37. return true;
  38. }
  1. //
  2. // POST: /Account/Login
  3. [HttpPost]
  4. [AllowAnonymous]
  5. [ValidateAntiForgeryToken]
  6. public async Task<ActionResult> Login(LoginViewModelmodel, string returnUrl)
  7. {
  8.     if (!CheckGeeTestResult())
  9.     {
  10.         ModelState.AddModelError("", "请先完成验证操作。");
  11.         return View(model);
  12.     }
  13.     if (!ModelState.IsValid)
  14.     {
  15.         return View(model);
  16.     }
  17.  
  18.     //其他验证逻辑
  19.     ...
  20.     }
  21. }
  22.  
  23. private bool CheckGeeTestResult()
  24. {
  25.     GeetestLibgeetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
  26.     Byte gt_server_status_code = (Byte)Session[GeetestLib.gtServerStatusSessionKey];
  27.     String userID = (String)Session["userID"];
  28.  
  29.     int result = 0;
  30.     String challenge = Request.Form.Get(GeetestLib.fnGeetestChallenge);
  31.     String validate = Request.Form.Get(GeetestLib.fnGeetestValidate);
  32.     String seccode = Request.Form.Get(GeetestLib.fnGeetestSeccode);
  33.     if (gt_server_status_code == 1) result = geetest.enhencedValidateRequest(challenge, validate, seccode, userID);
  34.     else result = geetest.failbackValidateRequest(challenge, validate, seccode);
  35.     if (result != 1) return false;
  36.  
  37.     return true;
  38. }
  39.  
  40.  

上述代码中大部分引用了极验官方DEMO的代码。这样我们在前台view中可以使用

  1. @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  1. @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  2.  

来提示用户首先需要通过滑块验证才能继续操作。

这样我们就完成了将极验验证集成到我们的ASP.NET MVC项目中。并且可以在极验的后台中查看具体的数据报表:

整个产品的使用我们并没有编写太多的代码,而且将复杂的验证过程交给了第三方,而我们自己只需要关心自己的业务逻辑

在ASP.NET MVC项目中使用极验验证(geetest)的更多相关文章

  1. 在 ASP.NET MVC 项目中使用 WebForm、 HTML

    原文地址:http://www.cnblogs.com/snowdream/archive/2009/04/17/winforms-in-mvc.html ASP.NET MVC和WebForm各有各 ...

  2. 在已有的Asp.net MVC项目中引入Taurus.MVC

    Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...

  3. ASP.NET MVC项目中App_Code目录在程序应用

    学习ASP.NET MVC,如果你是开发ASP.NET MVC项目的,也许你去为项目添加前ASP.NET项目的APP_Code目录,在这里创建与添加的Class类,也许你无法在MVC项目所引用. 那这 ...

  4. 在ASP.NET MVC项目中使用React

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在开发钉钉的微应用,考虑到性能和UI库的支持,遂采用了React来开发前端. 目前 ...

  5. 在ASP.NET MVC 项目中 使用 echarts 画统计图

    echarts 官方地址:http://echarts.baidu.com/ 一.根据图中的数据怎么从数据库中获取并组装成对应格式: 从数据库中获取对应数据,然后在项目中引用Newtonsoft.Js ...

  6. 如何在node和vue前后端分离的项目中使用极客验证,用node的方式

    1.用express的脚手架和vue-cli的脚手架搭建的项目目录如下图 2.在vue-client的src/component新建一个login.vue文件,作为登录页面,代码如下 <temp ...

  7. ASP.NET MVC项目中EntityFramework"代码优先方法"的使用步骤

    EF提供了三种方式来实现项目,分别是: (1)代码优先方法: (2)模型优先方法: (3)数据库优先方法: 本篇主要记录在Vs2010环境下使用代码优先的方式实现数据库和后端代码数据交互,语言为C#, ...

  8. nginx在asp.net mvc项目中 配置 初步快速入门

    nginx 官方下载地址 http://nginx.org/en/download.html 一般.net项目要运行在IIS环境下,自然选择windows版下载 我这里下载了nginx/Windows ...

  9. ASP.NET MVC 项目中 一般处理程序ashx 获取Session

    1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString( ...

随机推荐

  1. Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)

    Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) 股票问题: 121. 买卖股票的最佳时机 122. ...

  2. C++调用windowsAPI

    1.需要#include <windows.h>http://zhidao.baidu.com/link?url=yOeEGkhe3-kVI6rCqyNp14IjTyXBkQhLeNt-X ...

  3. ubuntu linux环境下安装配置jdk和tomcat

    关于linux搭建服务器,ubuntu中jdk和tomcat的安装和配置 一.jdk的安装配置 1:去官网下载好自己需要的版本,注意,linux压缩文件通常以tar.gz结尾,别下载错了.本次我下载安 ...

  4. kettle 创建作业发送邮件

    1.创建作业 . 2. 发送邮件配置,测试邮件 发件地址可以使用的QQ.126.163等邮箱 smtp server的填写smtp.qq.com或者smtp.126.com等等都可以这里我用Q163邮 ...

  5. Spring Boot常用的注解以及含义<持续更新>

    1.@RestController和@RequestMapping注解 @RestController 和 @RequestMapping 注解是Spring MVC注解(它们不是Spring Boo ...

  6. 图的DFS与BFS遍历

    一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...

  7. C++中枚举类型的作用

    (1)C++中会使用const或者#define定义整型常量,当整型常量有多个且之间的值的全部或部分有递加的时候,定义起来稍显繁琐,此时用枚举类型显得很简洁: 例如: //使用const: const ...

  8. Swoft2.x 小白学习笔记 (三) --- Task、协程

    介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...

  9. Ruby Rails学习中:有点内容的静态页面

    续上篇: 一. 有点内容的静态页面 rails new 命令创建了一个布局文件, 不过现在最好不用.我们重命名这个文件: $ mv app/views/layouts/application.html ...

  10. Phython-守护线程

    import threading,time def run(n): print("task is ",n) time.sleep(2) print("task done& ...