.net8 webapi 获取校验验证码

目录

效果

添加【VerificationController.cs】

添加内存缓存服务【Program.cs】


效果

添加【VerificationController.cs】

  /// <summary>
  /// 验证码
  /// </summary>
  [Route("api/[controller]/[action]")]
  [ApiController]
  [AllowAnonymous] // 标记无需认证
  public class VerificationController : ControllerBase
  {
      private readonly IMemoryCache _memoryCache;

      public VerificationController(IMemoryCache memoryCache)
      {
          _memoryCache = memoryCache;
      }


      /// <summary>
      /// 获取验证码
      /// </summary>
      /// <returns></returns>
      [HttpGet]
      public ActionResult GetVerificationCode()
      {
          // 生成验证码文本(这里只生成一个简单的4位数字验证码)
        var captchaText = GenerateRandomCaptcha(4);

          // 存储验证码文本到缓存中,默认有效期为 5 分钟
          _memoryCache.Set(captchaText, captchaText, new TimeSpan(0, 5, 0));

          // 创建一个内存流来保存图片
          using (var bitmap = new Bitmap(100, 40))
          using (var graphics = Graphics.FromImage(bitmap))
          {
              graphics.Clear(Color.White);
              graphics.DrawString(captchaText, new Font("Arial", 20), Brushes.Black, new PointF(10, 5));

              // 将验证码图片保存到内存流
              using (var ms = new MemoryStream())
              {
                  bitmap.Save(ms, ImageFormat.Png);
                  ms.Seek(0, SeekOrigin.Begin);
                  return File(ms.ToArray(), "image/png");
              }
          }
      }

      /// <summary>
      /// 校验验证码
      /// </summary>
      /// <param name="code"></param>
      /// <returns></returns>
      [HttpPost]
      public ActionResult ValidateCaptcha(string code)
      {
          if (string.IsNullOrEmpty(code))
          {
              return BadRequest("验证码不能为空");
          }

          // 从缓存中获取验证码文本
          if (_memoryCache.TryGetValue(code, out var captchaValue))
          {
              // 校验验证码是否正确
              if (captchaValue.ToString() == code)
              {
                  return Ok("验证码正确");
              }
              else
              {
                  return BadRequest("验证码错误");
              }
          }
          return BadRequest("验证码错误");
      }

      /// <summary>
      /// 获取随机码
      /// </summary>
      /// <param name="length"></param>
      /// <returns></returns>
      private string GenerateRandomCaptcha(int length)
      {
          var random = new Random();
          const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
          return new string(Enumerable.Range(0, length)
              .Select(_ => chars[random.Next(chars.Length)])
              .ToArray());
      }
  }

添加内存缓存服务【Program.cs】

  public class Program
  {
      public static void Main(string[] args)
      {
          var builder = WebApplication.CreateBuilder(args);

          // Add services to the container.

          builder.Services.AddControllers();
          // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
          builder.Services.AddEndpointsApiExplorer();

          // 添加内存缓存服务
          builder.Services.AddMemoryCache();

          builder.Services.AddSwaggerGen(
              options =>
              {
                  // 反射获取接口及方法描述
                  var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                  //IncludeXmlComments 第二参数 true 则显示 控制器 注释
                  options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename), true);

                  //使用jwt
                  options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                  {
                      Description = "请在下方输入框子输入Bearer Token 开启JWT鉴权",
                      Name = "Authorization", // 默认名称,不能修改
                      In = ParameterLocation.Header,
                      Type = SecuritySchemeType.ApiKey,
                      Scheme = "Bearer"
                  });

                  //让swagger遵守jwt协议
                  options.AddSecurityRequirement(new OpenApiSecurityRequirement
                       {
                         {
                           new OpenApiSecurityScheme
                           {
                              Reference = new OpenApiReference
                              {
                                   Type = ReferenceType.SecurityScheme,
                                  Id = "Bearer"
                              }
                           },
                          new List<string>()
                          }
                       });
              });

          #region 允许跨域

          builder.Services.AddCors(options =>
          {
              options.AddPolicy("any", buffer =>
              {
                  buffer.AllowAnyOrigin() // 允许任何来源主机访问
                      .AllowAnyMethod()
                      .AllowAnyHeader();
              });
          });

          #endregion

          builder.Services.Configure<FormOptions>(p =>
          {
              p.ValueLengthLimit = int.MaxValue;
              p.MultipartBodyLengthLimit = int.MaxValue;
          });
          JwtData jwtData = new JwtData();

          // 获取jwt数据
          builder.Configuration.Bind("JWT", jwtData);
          UtilJwt.JwtData = jwtData;

          #region 添加jwt
          //添加JWT身份验证服务
          builder.Services.AddAuthentication(x =>
          {
              x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
              x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
          })
              .AddJwtBearer(options =>
                  {
                      options.TokenValidationParameters = new TokenValidationParameters
                      {
                          ValidateIssuer = true,//是否效验Issuer 
                          ValidateAudience = true,//是否效验Audience
                          ValidateLifetime = true,//是否验证失效时间
                          ValidateIssuerSigningKey = true,//是否效验SigningKey
                          ValidAudience = UtilJwt.JwtData.Audience,
                          ValidIssuer = UtilJwt.JwtData.Issuer,
                          IssuerSigningKey = UtilJwt.GetSecurityKey(),
                      };

                      options.Events = new JwtBearerEvents()
                      {
                          OnMessageReceived = context =>
                          {
                              context.Token = context.Request.Query["access_token"];
                              return Task.CompletedTask;
                          }
                      };
                  });

          #endregion

          var app = builder.Build();

          // Configure the HTTP request pipeline.
          if (app.Environment.IsDevelopment())
          {
              app.UseSwagger();
              app.UseSwaggerUI();
          }

          app.UseHttpsRedirection();

          //1、先开启认证
          app.UseAuthorization();
          //2、再开启授权
          app.UseAuthorization();

          // 配置跨域 要在授权和鉴权后
          app.UseCors("any");

          app.MapControllers();

          app.Run();
      }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值