using NetAdmin.Application.Services; using NetAdmin.Domain.Dto.Sys.Captcha; using NetAdmin.SysComponent.Application.Services.Sys.Dependency; using SixLabors.ImageSharp; using Yitter.IdGenerator; namespace NetAdmin.SysComponent.Application.Services.Sys; /// public sealed class CaptchaService : ServiceBase, ICaptchaService { private static readonly Assembly _entryAsm = Assembly.GetEntryAssembly(); private static readonly string _entryAsmName = _entryAsm.FullName![.._entryAsm.FullName.IndexOf(',')]; /// /// Initializes a new instance of the class. /// public CaptchaService() { } /// public async Task GetCaptchaImageAsync() { var (backgroundImage, sliderImage, offsetSaw) = await CaptchaImageHelper.CreateSawSliderImageAsync( _entryAsm, $"{_entryAsmName}.Assets.Captcha.background" , $"{_entryAsmName}.Assets.Captcha.template", (1, 101), (1, 7) , new Size(50, 50)) .ConfigureAwait(false); var id = $"{nameof(GetCaptchaImageAsync)}_{YitIdHelper.NextId()}"; return new GetCaptchaRsp { Id = id, BackgroundImage = backgroundImage, SliderImage = sliderImage, SawOffsetX = offsetSaw.X }; } /// public Task VerifyCaptchaAsync(VerifyCaptchaReq req) { req.ThrowIfInvalid(); if (req.SawOffsetX == null) { return Task.FromResult(false); } bool ret; try { var aesKey = req.Id.Aes(CaptchaOptions.SecretKey)[..32]; ret = Math.Abs(req.SawOffsetX.Value - req.VerifyData.AesDe(aesKey).Float()) < 5f; } catch { ret = false; } return Task.FromResult(ret); } }