将输入的 OTP 与 ASP.NET Core MVC 中生成的 OTP 匹配

Match the entered OTP with the Generated OTP in ASP.NET Core MVC

我正在构建一个 ASP.NET 核心 MVC 应用程序,当用户点击“生成 OTP”时,屏幕上会显示一个 4 位数的 OTP,然后他必须输入该 OTP输入字段并单击“提交 OTP” tp 提交它。如果 OTP 正确并在 30 秒内输入,则用户将看到一条成功消息,否则用户将收到 OTP 超时或不正确的异常消息。

我已经编写了用于生成 OTP、发送和提交的控制器代码。

我面临的问题是在“控制器”中。 我已将“generateOtp”操作方法生成的 OTP 的值存储在“TempData[”otp]”中,现在我正尝试在“submitOtp”操作方法中使用它。 但它不起作用,我在这里弄错了什么?

**Controller**

namespace OTP_Sms_Verification.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public IActionResult GenerateOtp()
        {
            return View();
        }

        [HttpPost]
        public IActionResult SendOtp(Home home)
        {

            var hom = new Home();

            home.num="01223456789";
            home.len = home.num.Length;
            home.otp = String.Empty;
            home.otpDigit = 4;


            for (int i = 0; i < home.otpDigit; i++)
            {

                do
                {
                    home.getIndex = new Random().Next(0, home.len);
                    home.finalDigit = home.num.ToCharArray()[home.getIndex].ToString();
                } while (home.otp.IndexOf(home.finalDigit) != -1);
                home.otp += home.finalDigit;

            }
            TempData["otp"] = home.otp;

            //ViewBag.otp = home.otp;
            //ViewData["otp"] = home.otp;
            //TempData["timestamp"] = DateTime.Now;
            return RedirectToAction("GenerateOtp");

        }


        [HttpPost]
        public IActionResult SubmitOtp([FromForm] int finalDigit)
        {
            int a = Convert.ToInt32(TempData["otp"]);
            if (finalDigit == null) {
                return NoContent();
            }

            else if ((DateTime.Now - Convert.ToDateTime(TempData["timestamp"])).TotalSeconds > 30)
            {
                return BadRequest("OTP Timedout");
            }
            else if (finalDigit.ToString() == Convert.ToString(a))
            {
                return Ok("OTP Accepted");
            }
            else
            {
                return BadRequest("Please Enter Valid OTP");
            }
        }

    }
}



**Model**


@model OTP_Sms_Verification.Models.Home;

@{
    ViewData["Title"] = "GenerateOtp";
}

<h1>GenerateOtp</h1>

<form method="post" asp-action="SendOtp" asp-controller="Home">

    <br />

    <input type="submit" value="GetOtp" class="btn btn-primary btn-lg"/>

    <br />

    <div>
        @TempData["otp"]
    </div>
    </form>

@using (Html.BeginForm("SubmitOtp", "Home", FormMethod.Post))
    {
        <table cellpadding="0" cellspacing="0">
            
            <tr>
                <td>OTP: </td>
                <td>
                    <input type="number" name="finalDigit">
                </td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="SubmitOtp"/></td>
            </tr>
        </table>
    }

TempData 仅在当前和后续请求期间有效。所以当你提交的时候,是第三次请求,它会丢失存储的值。要持久化它,您可以尝试使用 TempData KeepPeek 函数。

Keep函数用于保存TempData对象的数据,即使在读取值后也是如此,而Peek函数用于读取值而不清除它。

将您的查看代码更改为:

<form method="post" asp-action="SendOtp" asp-controller="Home">
    <br />
    <input type="submit" value="GetOtp" class="btn btn-primary btn-lg"/>
    <br />
    <div>
        @TempData["otp"]
        @{
            TempData.Keep("otp"); //add this...
        }
    </div>
</form>

更多详情请参考this answer here

如果你使用TempData超过三个请求,我建议你使用Session