从不同的类调用随机代码/ OTP- ASP.NET Web API

hc8w905p  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(120)

这是我第一次发帖,很抱歉的问题格式,我不知道如何编辑它。
我的问题是,是否可以调用在不同类中生成的数据(在本例中为OTP的随机代码),在本例中是从OTP控制器类到电子邮件服务类?
我正在用ASP.NET Web API生成一个发送到电子邮件的OTP。到目前为止,我创建了一个单独的类/控制器来生成和保存OTP,然后是另一个类来设置电子邮件服务,最后是电子邮件控制器来发送电子邮件。
我生成一个随机代码作为OTP直接发送到数据库与后方法。
这是OTP控制器中的代码

[HttpPost]
public async Task<IActionResult> AddOTPs(Otp otp)
{
    Random rand = new Random();
    randomcode = (rand.Next(9999999)).ToString();

    var otps = new Otp()
        {
            AlamatEmail = otp.AlamatEmail,
            NamaKaryawan = otp.NamaKaryawan,
            OTP_C = randomcode,
        };

    await _context.Otps.AddAsync(otps);
    await _context.SaveChangesAsync();

    return Ok(otps);
}

在另一个类中,我设置了电子邮件服务,以便在电子邮件控制器中调用。代码如下:

public void SendEmail(Otp request)
{
    var email = new MimeMessage();
    email.From.Add(MailboxAddress.Parse(_config.GetSection("EmailUsername").Value));
    email.To.Add(MailboxAddress.Parse(request.AlamatEmail));
    email.Subject = "OTP Test";
    email.Body = new TextPart(TextFormat.Html) { 
            Text = request.OTP_C
        };

    using var smtp = new SmtpClient();
    smtp.Connect(_config.GetSection("EmailHost").Value, 587, SecureSocketOptions.StartTls);
    smtp.Authenticate(_config.GetSection("EmailUsername").Value, _config.GetSection("EmailPassword").Value);

    smtp.Send(email);
    smtp.Disconnect(true);
}

电子邮件控制器代码:

[HttpPost]
public IActionResult SendEmail(Otp request)
{
    _emailService.SendEmail(request);
    return Ok();
}

现在,所有这些代码都运行良好,没有任何错误,但是当我必须调用单独的API来将OTP发布到数据库,然后调用另一个API来发送电子邮件时,我必须手动输入电子邮件地址和OTP。所以现在的流程是这样的,将OTP发布到数据库API,从数据库API获取OTP,然后发布发送电子邮件API,总共需要3次API调用。
我的问题是:我如何确保OTP控制器中生成的随机码被发送到电子邮件服务类?或者我如何使它在OTP生成时被保存到数据库中,然后发送电子邮件。
基本上,我希望通过消除从数据库API获取OTP来确保只有1-2个API被调用,而不是3个。
先谢谢你了。
所有代码都是用C#为ASP.NET框架编写的

unftdfkk

unftdfkk1#

你不能这样做。如果你在控制器后面有一个外观类会更好。你可以调用外观类,这个类会将OTP保存到数据库中,然后用相同的OTP调用电子邮件服务。然后这个外观类可以从控制器调用。

public class OTPFacede{ 
private readonly EmailService _emailService;
private readonly DBContext _context;
public OTPFacede(EmailSevice emailservice,DBContext context){ 
         _emailService = emailService;
         _context = context;
}
public void SaveAndSendOtp(){
        Random rand = new Random();
        randomcode = (rand.Next(9999999)).ToString();
        var otps = new Otp()
        {
            AlamatEmail = otp.AlamatEmail,
            NamaKaryawan = otp.NamaKaryawan,
            OTP_C = randomcode,
        };
        _context.Otps.AddAsync(otps);
        _context.SaveChanges();
         SendEmail(otps)
   }

public void  SendEmail(Otp request){

       
        var email = new MimeMessage();
        email.From.Add(MailboxAddress.Parse(_config.GetSection("EmailUsername").Value));
        email.To.Add(MailboxAddress.Parse(request.AlamatEmail));
        email.Subject = "OTP Test";
        email.Body = new TextPart(TextFormat.Html) { 
            Text = request.OTP_C
        };

        using var smtp = new SmtpClient();
        smtp.Connect(_config.GetSection("EmailHost").Value, 587, SecureSocketOptions.StartTls);
        smtp.Authenticate(_config.GetSection("EmailUsername").Value, _config.GetSection("EmailPassword").Value);
        smtp.Send(email);
        smtp.Disconnect(true);
    }

}

mfuanj7w

mfuanj7w2#

这不是对你问题的回答,而是对你在评论中提出的问题的回应(关于加密强随机密码的一些示例代码)
代码如下:

public static string GetRandomString(int entropyByteCount)
{
    using (var rng = RandomNumberGenerator.Create())
    {
        var byteArray = new byte[entropyByteCount * 8];
        rng.GetBytes(byteArray);
        return BytesToHexString(byteArray);
    }       
}

private static string BytesToHexString(byte[] bytes)
{
    var buffer = new StringBuilder(bytes.Length * 2);
    foreach (var b in bytes)
    {
        buffer.Append(b.ToString("X2"));
    }
    return buffer.ToString();
}

结果将是一个十六进制字符串,其字符数是entropyByteCount参数值的16倍。这是因为传递给GetBytes的数组中的字节数实际上应该可以被8整除,并且需要两个十六进制数字来呈现一个字节的内容。
程式码预期您的程式中会有这个(using System.Security.Cryptography;)。
有更好的方法将字节数组转换为十六进制字符串,看看:How do you convert a byte array to a hexadecimal string, and vice versa?

相关问题