首页 > 编程语言 >aspnet zero 12 添加登录 验证码

aspnet zero 12 添加登录 验证码

时间:2024-03-11 14:12:53浏览次数:22  
标签:12 string public S4 captcha zero var id aspnet

      aspnet zero 自带的验证码是基于Google ,国内当前无法使用,只能替换国内的。实现后的界面如下图:

 

Install-Package Lazy.Captcha.Core
  • 验证码后端代码
public interface ICaptchaAppService : IApplicationService
    {
        /// <summary>
        /// 获取验证码
        /// </summary>
        /// <param name="id">Id</param>
        Stream Captcha(string id);

        /// <summary>
        /// 验证验证码
        /// </summary>
        /// <param name="id">Id</param>
        /// <param name="code">Code</param>
        /// <returns></returns>
        Task ValidateAsync(string id,string code);
    }
    
    public class CaptchaAppService : SISAppServiceBase, ICaptchaAppService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly ICaptcha _captcha;

        public CaptchaAppService(ICaptcha captcha, IHttpContextAccessor httpContextAccessor)
        {
            _captcha = captcha;
            _httpContextAccessor = httpContextAccessor;
        }

        public Stream Captcha(string id)
        {
            var captcha = _captcha.Generate(id, 30);
            var stream = new MemoryStream(captcha.Bytes);
            return stream;
        }


        public async Task ValidateAsync(string id, string code)
        {
            var httpContext = _httpContextAccessor.HttpContext;
            if (httpContext == null)
            {
                throw new Exception("RecaptchaValidator should be used in a valid HTTP context!");
            }

            if (id.IsNullOrEmpty() || code.IsNullOrEmpty())
            {
                throw new UserFriendlyException(L("CaptchaCanNotBeEmpty"));
            }

            var result = _captcha.Validate(id, code);

            if (!result)
            {
                throw new UserFriendlyException(L("IncorrectCaptchaAnswer"));
            }

            await Task.CompletedTask;

        }
    }
  • 登录验证代码
      [HttpPost]
      public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "",
          string returnUrlHash = "", string ss = "")
      {
          returnUrl = NormalizeReturnUrl(returnUrl);
          if (!string.IsNullOrWhiteSpace(returnUrlHash))
          {
              returnUrl = returnUrl + returnUrlHash;
          }

          string id = HttpContext.Request.Form["id"];
          string captcha = HttpContext.Request.Form["captcha"];
          await _captchaAppservice.ValidateAsync(id, captcha);

          var loginResult = await GetLoginResultAsync(
              loginModel.UsernameOrEmailAddress,
              loginModel.Password,
              GetTenancyNameOrNull()
          );
          
         //其它代码省略 .....
      }
  • 前端HTML 和Javascript 代码
<div class="mb-5">
            <div class="row">
                <div class="col-6">
                    <input type="text" class="form-control form-control-solid h-auto  px-6 rounded-lg fs-6"
                        placeholder="验证码"  name="captcha" id="captcha" 
                        style="padding-top:1.0rem !important;padding-bottom:1.0rem !important;"/>
                </div>
                <div class="col-6">
                    <img src="/" width="100" height="50" id="captchaImage"/>
                </div>
            </div>
        </div>
  function guid() {
      function S4() {
          return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
      }
      return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
  }

  function bingImage() {

      var id = guid();
      $("#guid").val(id);
      var src = abp.appPath + "captcha/captcha?id="+ id;
      $("#captchaImage").attr("src", src);
  }

  $("#captchaImage").click(function () {
      bingImage();
  });
  return {
      init: function () {
          bingImage();  //在原有的代码基础上新增初始化加载img
      handleLogin();
    },

 

标签:12,string,public,S4,captcha,zero,var,id,aspnet
From: https://www.cnblogs.com/w2011/p/18065965

相关文章

  • es12
    的ECMAScript(ES)标准是ES12,也被称为ES2022。ES2022于2021年发布,引入了一些新的语言特性和改进。以下是ES2022中的一些主要特性:String.prototype.replaceAll()方法:replaceAll()方法用于替换字符串中所有匹配的子字符串。javascriptCopyCodeconststr='Hello,Wor......
  • 在 Debian 12.5 上编译安装 Nginx
    1.更新系统软件包并安装必要的构建工具和依赖项:sudoaptupdatesudoaptupgradesudoaptinstallbuild-essentialzlib1g-devlibpcre3-devlibssl-devbash2.下载Nginx源码包:wgethttp://nginx.org/download/nginx-x.y.z.tar.gz#替换x.y.z为你要安装的Nginx版本号tar......
  • [LeetCode] 2129. Capitalize the Title
    Youaregivenastringtitleconsistingofoneormorewordsseparatedbyasinglespace,whereeachwordconsistsofEnglishletters.Capitalizethestringbychangingthecapitalizationofeachwordsuchthat:Ifthelengthofthewordis1or2letters......
  • 在Windows server 2012R2系统安装使用docker
    REF:https://blog.csdn.net/user_san/article/details/121037022需要进行配置,否则无法将端口映射出来,导致连接不上数据库。另外MYSQL8.0签权方式改变,无法通过navicat连接,需要修改ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'123123';FLUSHPRIVILEGES......
  • r8125 驱动
    ubuntu装了一个老版本,不支持r8125的网卡。上官网下了一个驱动,安装就可以使用了。https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software 但新的问题是,每次内核升级,都需要重新安装。新的......
  • LeetCode 128.最长连续序列 Python题解
    leetcode128题最长连续序列分享解题思路,使用哈希表算法......
  • P1884 [USACO12FEB] Overplanting S
    原题链接题解把覆盖的区域变成黑色,然后在区域内划几条竖线,一定能分成若干个矩形左右拼接而成的图形想象一条竖着的线,它的运动轨迹是不连续的,即他会从一个矩形的竖边跳到另一个矩形的竖边,每跳一条竖边都会对借着竖边归属的矩形的信息对这条竖边的激活块进行修改当竖线的绝对位......
  • 122. 买卖股票的最佳时机 II c
    、动态规划太难啦!intgetmax(inti,intj){if(i>j)returni;returnj;}intmaxProfit(int*prices,intpricesSize){if(pricesSize==1)return0;int**dp=(int**)malloc(sizeof(int*)*pricesSize);//dp[i][0/1]第i结束交易时天的最大收益,0/1代表有......
  • 7-12 求迷宫最短通道(整合版)
    7-12求迷宫最短通道(整合版,代码非原创)分数10作者C专题课程组-humin单位浙江大学递归求解迷宫最短通道的总步长。输入一个迷宫,求从入口通向出口的可行路径中最短的路径长度。为简化问题,迷宫用二维数组intmaze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是......
  • UVA12101 Prime Path
    PrimePath\(link\)题面翻译给你个整数\(T(T\leq100)\),接下来\(T\)行数据。每次给你俩数\(a,b\)(保证都是四位数且都为无前导零的质数),问\(a\)经过几次变换可以变成\(b\)。输出最少可以经过几次变换变成\(b\)的次数。如果变不成直接输出Impossible。规定\(a\)可以......