You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.OutputCaching;
|
|
using Microsoft.Extensions.Caching.Distributed;
|
|
using WTA.Shared.Captcha;
|
|
|
|
namespace WTA.Application.Captcha;
|
|
|
|
[Route("api/[controller]")]
|
|
public class CaptchaController : Controller
|
|
{
|
|
private readonly IDistributedCache _cache;
|
|
private readonly ICaptchaService _captchaService;
|
|
|
|
public CaptchaController(IDistributedCache cache, ICaptchaService captchaService)
|
|
{
|
|
this._cache = cache;
|
|
this._captchaService = captchaService;
|
|
}
|
|
|
|
[HttpGet]
|
|
[AllowAnonymous]
|
|
[OutputCache(NoStore = true)]
|
|
public IActionResult Index()
|
|
{
|
|
var code = string.Empty;
|
|
var builder = new StringBuilder();
|
|
builder.Append(code);
|
|
for (var i = 0; i < 4; i++)
|
|
{
|
|
var random = new byte[1];
|
|
using var generator = RandomNumberGenerator.Create();
|
|
generator.GetBytes(random);
|
|
builder.Append(new Random(Convert.ToInt32(random[0])).Next(0, 9));
|
|
}
|
|
code = builder.ToString();
|
|
var key = Guid.NewGuid().ToString();
|
|
this._cache.SetString(key, code, new DistributedCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(5) });
|
|
return Json(new
|
|
{
|
|
Captcha = this._captchaService.Create(code),
|
|
CaptchaKey = key
|
|
});
|
|
}
|
|
}
|
|
|