Проверка почты при ее подтверждении

столкнулся с проблемой проверки введенного секретного кода на емейл, создал такой контроллер 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 подавно. Как можно нормально проверять введенный код на корректность с отправленным на емейл, но при этом не передавая какие-либо данные кроме секретного кода в тело запроса?


Ответы (0 шт):