在ASP.NET MVC项目中使用极验验证(geetest)
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):
<div id="geetest-container">
</div>
<script src="http://static.geetest.com/static/tools/gt.js"></script>
<script>
window.addEventListener('load',processGeeTest);
function processGeeTest() {
$.ajax({
// 获取id,challenge,success(是否启用failback)
url: "/Account/GeekTest",
type: "get",
dataType: "json", // 使用jsonp格式
success: function (data) {
// 使用initGeetest接口
// 参数1:配置参数,与创建Geetest实例时接受的参数一致
// 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
initGeetest({
gt: data.gt,
challenge: data.challenge,
product: "float", // 产品形式
offline: !data.success
}, handler);
}
});
}
var handler = function (captchaObj) {
// 将验证码加到id为captcha的元素里
captchaObj.appendTo("#geetest-container");
captchaObj.onSuccess = function(e) {
console.log(e);
}
};
</script>
<divid="geetest-container">
</div>
<scriptsrc="http://static.geetest.com/static/tools/gt.js"></script>
<script>
window.addEventListener('load',processGeeTest);
function processGeeTest() {
$.ajax({
// 获取id,challenge,success(是否启用failback)
url: "/Account/GeekTest",
type: "get",
dataType: "json", // 使用jsonp格式
success: function (data) {
// 使用initGeetest接口
// 参数1:配置参数,与创建Geetest实例时接受的参数一致
// 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
initGeetest({
gt: data.gt,
challenge: data.challenge,
product: "float", // 产品形式
offline: !data.success
}, handler);
}
});
}
var handler = function (captchaObj) {
// 将验证码加到id为captcha的元素里
captchaObj.appendTo("#geetest-container");
captchaObj.onSuccess = function(e) {
console.log(e);
}
};
</script>
上述代码中使用了JQuery库,需要同时引用。其中我们使用Ajax来动态请求后台AccountController的GeeTest方法,代码如下:
public ActionResult GeekTest()
{
string result = getCaptcha(); return Content(result, "application/json");
} private String getCaptcha()
{
GeetestLib geetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
Byte gtServerStatus = geetest.preProcess();
Session[GeetestLib.gtServerStatusSessionKey] = gtServerStatus;
return geetest.getResponseStr();
}
public ActionResultGeekTest()
{
string result = getCaptcha();
return Content(result, "application/json");
}
private String getCaptcha()
{
GeetestLibgeetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
Byte gtServerStatus = geetest.preProcess();
Session[GeetestLib.gtServerStatusSessionKey] = gtServerStatus;
return geetest.getResponseStr();
}
上述代码中的 geetest_publicKey 和 geetest_privateKey 分别对应极验后台申请到的ID和KEY。
这样我们就可以运行程序看到效果。接下来的工作就是确认用户在提交对应的表单的时候有没有通过极验的验证了。
在接受表单提交的POST地址里面输入代码,例如:
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!CheckGeeTestResult())
{
ModelState.AddModelError("", "请先完成验证操作。");
return View(model);
}
if (!ModelState.IsValid)
{
return View(model);
} //其他验证逻辑
...
}
} private bool CheckGeeTestResult()
{
GeetestLib geetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
Byte gt_server_status_code = (Byte)Session[GeetestLib.gtServerStatusSessionKey];
String userID = (String)Session["userID"]; int result = 0;
String challenge = Request.Form.Get(GeetestLib.fnGeetestChallenge);
String validate = Request.Form.Get(GeetestLib.fnGeetestValidate);
String seccode = Request.Form.Get(GeetestLib.fnGeetestSeccode);
if (gt_server_status_code == 1) result = geetest.enhencedValidateRequest(challenge, validate, seccode, userID);
else result = geetest.failbackValidateRequest(challenge, validate, seccode);
if (result != 1) return false; return true;
}
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModelmodel, string returnUrl)
{
if (!CheckGeeTestResult())
{
ModelState.AddModelError("", "请先完成验证操作。");
return View(model);
}
if (!ModelState.IsValid)
{
return View(model);
}
//其他验证逻辑
...
}
}
private bool CheckGeeTestResult()
{
GeetestLibgeetest = new GeetestLib(geetest_publicKey, geetest_privateKey);
Byte gt_server_status_code = (Byte)Session[GeetestLib.gtServerStatusSessionKey];
String userID = (String)Session["userID"];
int result = 0;
String challenge = Request.Form.Get(GeetestLib.fnGeetestChallenge);
String validate = Request.Form.Get(GeetestLib.fnGeetestValidate);
String seccode = Request.Form.Get(GeetestLib.fnGeetestSeccode);
if (gt_server_status_code == 1) result = geetest.enhencedValidateRequest(challenge, validate, seccode, userID);
else result = geetest.failbackValidateRequest(challenge, validate, seccode);
if (result != 1) return false;
return true;
}
上述代码中大部分引用了极验官方DEMO的代码。这样我们在前台view中可以使用
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
来提示用户首先需要通过滑块验证才能继续操作。
这样我们就完成了将极验验证集成到我们的ASP.NET MVC项目中。并且可以在极验的后台中查看具体的数据报表:

整个产品的使用我们并没有编写太多的代码,而且将复杂的验证过程交给了第三方,而我们自己只需要关心自己的业务逻辑
在ASP.NET MVC项目中使用极验验证(geetest)的更多相关文章
- 在 ASP.NET MVC 项目中使用 WebForm、 HTML
原文地址:http://www.cnblogs.com/snowdream/archive/2009/04/17/winforms-in-mvc.html ASP.NET MVC和WebForm各有各 ...
- 在已有的Asp.net MVC项目中引入Taurus.MVC
Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...
- ASP.NET MVC项目中App_Code目录在程序应用
学习ASP.NET MVC,如果你是开发ASP.NET MVC项目的,也许你去为项目添加前ASP.NET项目的APP_Code目录,在这里创建与添加的Class类,也许你无法在MVC项目所引用. 那这 ...
- 在ASP.NET MVC项目中使用React
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在开发钉钉的微应用,考虑到性能和UI库的支持,遂采用了React来开发前端. 目前 ...
- 在ASP.NET MVC 项目中 使用 echarts 画统计图
echarts 官方地址:http://echarts.baidu.com/ 一.根据图中的数据怎么从数据库中获取并组装成对应格式: 从数据库中获取对应数据,然后在项目中引用Newtonsoft.Js ...
- 如何在node和vue前后端分离的项目中使用极客验证,用node的方式
1.用express的脚手架和vue-cli的脚手架搭建的项目目录如下图 2.在vue-client的src/component新建一个login.vue文件,作为登录页面,代码如下 <temp ...
- ASP.NET MVC项目中EntityFramework"代码优先方法"的使用步骤
EF提供了三种方式来实现项目,分别是: (1)代码优先方法: (2)模型优先方法: (3)数据库优先方法: 本篇主要记录在Vs2010环境下使用代码优先的方式实现数据库和后端代码数据交互,语言为C#, ...
- nginx在asp.net mvc项目中 配置 初步快速入门
nginx 官方下载地址 http://nginx.org/en/download.html 一般.net项目要运行在IIS环境下,自然选择windows版下载 我这里下载了nginx/Windows ...
- ASP.NET MVC 项目中 一般处理程序ashx 获取Session
1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString( ...
随机推荐
- 配置cinder-backup服务使用ceph作为后端存储
在ceph监视器上执行 CINDER_PASSWD='cinder1234!'controllerHost='controller'RABBIT_PASSWD='0penstackRMQ' 1.创建p ...
- 第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...
- 2019牛客暑期多校训练营(第八场)-A All-one Matrices (单调栈+前缀和)
题目链接:https://ac.nowcoder.com/acm/contest/888/A 题意:给n×m的01矩阵,求出其中全为1的矩阵个数(不被其它全1矩阵包括). 思路:和第二场多校的次大子矩 ...
- Springboot使用launch.script打包后解压缩
今天拿到一个SpringBoot的jar需要反编译看一下.直接用工具试了下提示报错. 于是用文本工具打开看了下,发现此JAR包在打包时候引入了启动脚本.如下图: 为了反编译,可以直接将所有启动脚本相关 ...
- 进行hcmcloud 数据库备份以及设置的处理过程.
导入数据库以及简单设置. 最近进行了一个数据库备份的简单工作: create database hcmcloud create user hcm with password 'Test6530' 执行 ...
- 小a的强迫症 题解
题面: 小a是一名强迫症患者,现在他要给一群带颜色的珠子排成一列,现在有N种颜色,其中第i种颜色的柱子有num(i)个.要求排列中第i种颜色珠子的最后一个珠子,一定要排在第i+1种颜色的最后一个珠子之 ...
- MyBatis学习存档(1)——入门
一.简介 MyBatis的前身是iBatis,本是Apache的一个开源的项目 MyBatis是一个数据持久层(ORM)框架,把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现 MyB ...
- windows 控制台默认为UTF-8显示的方法
这里需要先了解些内容: CHCP CHCP是MS DOS中的命令,用来显示或设置活动代码页编号的.用法是: CHCP [nnn] 其中nnn指定的是代码页的编号.这个参数是可选的,在命令行下如果不指定 ...
- sql lesson21homework
2017-08-15 18:03:17 mysql> show databases;+--------------------+| Database |+---------- ...
- bash 中的 :=、=、:-、-、=?、?、:+、+
bash 中的 :=.=.:-.-.=?.?.:+.+ 来源 https://www.cnblogs.com/fhefh/archive/2011/04/22/2024750.html 变量替换和变量 ...