应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

使用腾讯滑块验证码

14178人阅读 2020/1/8 16:15 总访问:5193923 评论:0 收藏:0 手机
分类: 随笔

使用腾讯防水墙接入滑动验证效果,防止恶意、可疑用户登陆

接入代码还是很简单

首先要去腾讯防水墙注册账号,登陆后创建验证 官方地址:https://007.qq.com

创建之后点击到【快速接入】可以查看到appid和秘钥:

嗯~准备工作已完成,下面就是代码进行客户端接入和服务器接入了

一、客户端接入:

    客户端接入即前端引入html和js代码(非常简单)

    1、引入js 

  1. <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>

 2、验证按钮(这个一般就是你的登陆按钮,按照腾讯固定格式)

  1. <button type="button" class="pn" id="TencentCaptcha" data-appid="你的data-appid" data-cbfn="callback">进入后台系统</button>

为了后台传值验证我这里加了2个隐藏的input用于存储回调的票据和随机字符串

  1. <!--防水墙票据、字符串 begin-->
  2. <input type="hidden" value="" name="ticket" id="ticket">
  3. <input type="hidden" value="" name="randstr" id="randstr">
  4. <!--防水墙票据、字符串 end-->

 3、回调函数

  1.   <script>
  2.         window.callback = function(res{
  3.             if (res.ret === 1) {//验证失败
  4.                 alert("未通过验证,请重新验证");
  5.                 return;
  6.             }
  7.             if (res.ret === 0) {//验证成功
  8.                 //这里就是给上面的2个标签赋值
  9.                 $('#ticket').attr('value', res.ticket);//回调的票据
  10.                 $('#randstr').attr('value', res.randstr);//回调的字符串
  11.                 PreventLogin();
  12.             }
  13.         }
  14.     </script>

贴一个完整一点的代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta name="viewport" content="width=device-width" />
  5.     <title>Login</title>
  6.     <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
  7.     <script src="~/lib/jquery/dist/jquery.js"></script>
  8.     <script>
  9.         window.callback = function (res{
  10.             if (res.ret === 1) {//验证失败
  11.                 alert("未通过验证,请重新验证");
  12.                 return;
  13.             }
  14.             if (res.ret === 0) {//验证成功
  15.                 //这里就是给上面的2个标签赋值
  16.                 $('#ticket').attr('value', res.ticket);//回调的票据
  17.                 $('#randstr').attr('value', res.randstr);//回调的字符串
  18.                 //提交表单
  19.                 $("#loginform").submit()               
  20.             }
  21.         }
  22.     </script>
  23. </head>
  24. <body>
  25.     <div align="center">
  26.         <h1>tnblog统一认证登录中心</h1>
  27.         <form method="post" id="loginform" action="/account/Login">
  28.             <!--防水墙票据、字符串 begin-->
  29.             <input type="hidden" value="" name="ticket" id="ticket">
  30.             <input type="hidden" value="" name="randstr" id="randstr">
  31.             <!--防水墙票据、字符串 end-->
  32.             用户名:<input type="text" name="userName" /><br />
  33.             密  码:<input type="password" name="password" />
  34.             <input type="hidden" name="returnUrl" value="@ViewData["returnUrl"]" /> <br />
  35.             <input type="button" id="TencentCaptcha" data-appid="你的data-appid" data-cbfn="callback" value="登录" />
  36.         </form>
  37.     </div>
  38. </body>
  39. </html>

至此客户端接入就已经完成了,现在就可以看到效果了(登录样式请忽略):


二、服务器接入:

    在验证完成后,客户端收到获得一个验证票据(ticket)。将票据上传至服务器,并发送GET请求到下方接口可以校验验证码的票据,判断当次验证是否成功。

    后台代码写在登陆之前:

    URL: https://ssl.captcha.qq.com/ticket/verify


字段名描述
aid (必填)2096*******
AppSecretKey (必填)0CB7wV-**********dA1koXQ**
Ticket (必填)验证码客户端验证回调的票据
Randstr (必填)验证码客户端验证回调的随机串
UserIP (必填)提交验证的用户的IP地址(eg: 10.127.10.2)


后台代码:

  1. [HttpPost]
  2. public async Task<IActionResult> Login(string userName, string password, string verifycode, string ticket, string randstr, string returnUrl = null)
  3. {
  4.     //验证腾讯的防水墙
  5.     #region 防水墙验证(Get请求)
  6.     string url = "https://ssl.captcha.qq.com/ticket/verify?";//请求地址
  7.     //参数
  8.     string aid = _aid;//你的appid
  9.     string AppSecretKey = _AppSecretKey;//你的App Secret Key
  10.     string UserIp = HttpContext.Connection.RemoteIpAddress.ToString();
  11.     //获取id方法2
  12.     //string UserIp =  HttpContext.Request.UserHostAddress
  13.     string parameters = string.Format("aid={0}&AppSecretKey={1}&Ticket={2}&Randstr={3}&UserIP={4}", aid, AppSecretKey, ticket, randstr, UserIp);
  14.     url = url + parameters;
  15.     //http get请求
  16.     HttpClient httpClient = new HttpClient();
  17.     string resulttoken = await httpClient.GetAsync(url).Result.Content.ReadAsStringAsync();
  18.     //验证结果
  19.     TencentCaptchaResultData tencentCaptcha = JsonConvert.DeserializeObject<TencentCaptchaResultData>(resulttoken);
  20.     //1:表示验证通过 0:失败
  21.     if (tencentCaptcha.response != 1)//失败则抛出异常,反之就进行后面的用户密码验证,判定是否等成功
  22.     {
  23.         throw new Exception("防水墙验证失败!");
  24.     }
  25.     #endregion
  26.     ViewData["returnUrl"] = returnUrl;
  27.     #region 内部账户验证
  28.     return Redirect(returnUrl);
  29.     #endregion
  30. }

TencentCaptchaResultData 就是一个方便反序列的实体而已:

  1. public class TencentCaptchaResultData
  2.     {
  3.         public int response { getset; }
  4.         public string evil_level { getset; }
  5.         public string err_msg { getset; }
  6.     }



三、自发起验证

默认的方式是用的按钮的id等标识触发的验证,但是有些时候想要自己控制触发,而不是默认的这样

这样还可以灵活的控制触发验证的时间点,比如需要通过客户端的验证才去触发滑块验证等操作


先生成一个验证码对象

  1.  // 直接生成一个验证码对象
  2.         var captcha1 = new TencentCaptcha('你的appid'function (res{
  3.             if (res.ret === 1) {//验证失败
  4.                 alert("未通过验证,请重新验证");
  5.                 return;
  6.             }
  7.             if (res.ret === 0) {//验证成功
  8.                 //这里就是给上面的2个标签赋值
  9.                 $('#ticket').attr('value', res.ticket);//回调的票据
  10.                 $('#randstr').attr('value', res.randstr);//回调的字符串
  11.                 //js提交表单到后台(在这里指定提交方式和提交的页面)
  12.                 $("#LoginForm").attr("method""post");
  13.                 $("#LoginForm").attr("action""/Login/ExecLogin?" + '@ViewBag.pjurl').submit();
  14.             }
  15.         });

使用的时候直接 对象.show即可。可以创建多个对象也可以在任何时间节点使用更灵活

  1. captcha1.show();//发起验证





欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价