Проверка почты при ее подтверждении
столкнулся с проблемой проверки введенного секретного кода на емейл, создал такой контроллер EmailController:
[HttpPost("Verify-Email")]
public ActionResult<ServiceResponse<string>> VerifyEmail(string securityCode)
{
return Ok(_emailService.VerifyEmail(securityCode));
}
Вот сервис EmailService:
public ServiceResponse<string> SendEmail(string recipient)
{
var serviceResponse = new ServiceResponse<string>();
var email = new MimeMessage();
sentSecurityCode =CreateSecurityCode();
email.From.Add(MailboxAddress.Parse(_configuration.GetSection("EmailConfiguration:AdminEmail").Value));
email.To.Add(MailboxAddress.Parse(recipient));
email.Subject = "Security code to complete registration.";
email.Body = new TextPart(TextFormat.Plain) { Text = sentSecurityCode };
var smtp = new SmtpClient();
smtp.Connect(
_configuration.GetSection("EmailConfiguration:Host").Value,
Convert.ToInt32(_configuration.GetSection("EmailConfiguration:Port").Value),
SecureSocketOptions.StartTls
);
smtp.Authenticate(
_configuration.GetSection("EmailConfiguration:AdminEmail").Value,
_configuration.GetSection("EmailConfiguration:AdminPassword").Value
);
smtp.Send(email);
smtp.Disconnect(true);
serviceResponse.Data = null;
serviceResponse.Success = true;
serviceResponse.Message = "Security code sent to your email.";
return serviceResponse;
}
public ServiceResponse<string> VerifyEmail([FromBody]string securityCode)
{
var serviceResponse = new ServiceResponse<string>();
try {
if (securityCode != sentSecurityCode) {
throw new Exception("Invalid security code.");
}
serviceResponse.Data = null;
serviceResponse.Success = true;
serviceResponse.Message = "Email successfully confirmed.";
}catch(Exception ex) {
serviceResponse.Data = null;
serviceResponse.Success = false;
serviceResponse.Message = "Wrong security code.";
}
return serviceResponse;
}
Проблема в том, что у меня также есть AuthController, который отправляет секретный код при регистрации c помощью метода SendEmail из EmailService, затем происходит редирект на ендпоинт Verify-Email с подтверждением почты, запись о пользователе запишется в базу данных только после того, как он подтвердит свою почту с помощью секретного кода. Я думал хранить отправленный секретный код при первом вызове сервиса в AuthController, но если я укажу DI AddScoped, то на ендпоинте с подтверждением почты создастся новый инстанс, в котором уже не будет ранее указанного секретного кода, соответственнно AddTransient тоже не вариант, а уж и AddSingleton подавно. Как можно нормально проверять введенный код на корректность с отправленным на емейл, но при этом не передавая какие-либо данные кроме секретного кода в тело запроса?