ASP.Net Core 在网页部分实现 recaptcha 2

Nei*_*eil 5 c# recaptcha asp.net-core-mvc asp.net-core

我正在尝试将 reCaptcha v2 添加到我的 ASP.Net Core 网站。网站上大约有 30 多个页面,每个页面在内容的各个点都有一个“联系”表单部分。

我有本节的局部模型和视图模型,我将其包含在每个视图中:

部分调用:

@Html.Partial("_GetInTouchSection", GetInTouchViewModel)
Run Code Online (Sandbox Code Playgroud)

查看型号:

public class GetInTouchViewModel
{
    [Required(ErrorMessage="Please enter your name")]
    public string Name { get; set; }
    [Required(ErrorMessage = "Please enter your company name")]
    public string CompanyName { get; set; }
    [Required(ErrorMessage = "Please enter your telephone number")]
    public string TelephoneNumber { get; set; }
    [Required(ErrorMessage = "Please enter your email address")]
    public string EmailAddress { get; set; }
    [Required(ErrorMessage = "Please enter your message")]
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我发现很多文章都在谈论在独立页面上实现这一点(例如反馈或联系我们),回发到视图的控制器操作,如果 reCaptcha 请求失败,将用户返回到视图。

GitHub PaulMiami reCaptcha

[ValidateRecaptcha]
[HttpPost]
public IActionResult Index(YourViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        return new OkResult();
    }

    return View();
}
Run Code Online (Sandbox Code Playgroud)

https://retifrav.github.io/blog/2017/08/23/dotnet-core-mvc-recaptcha/#project

[HttpPost("Home/Feedback/")]
[AllowAnonymous]
public IActionResult Feedback(SomeModel model)
{
    // get reCAPTHCA key from appsettings.json
    ViewData["ReCaptchaKey"] = 
_configuration.GetSection("GoogleReCaptcha:key").Value;

if (ModelState.IsValid)
{
    if (!ReCaptchaPassed(
        Request.Form["g-recaptcha-response"], // that's how you get it from the Request object
        _configuration.GetSection("GoogleReCaptcha:secret").Value,
        _logger
        ))
    {
        ModelState.AddModelError(string.Empty, "You failed the CAPTCHA, stupid robot. Go play some 1x1 on SFs instead.");
        return View(model);
    }

    // do your stuff with the model
    // ...

    return View();
}

return View(model);
}
Run Code Online (Sandbox Code Playgroud)

目前,我对每个页面的控制器操作仅限于 HttpGet。

我没有为每个视图设置一个 post 操作,而是希望有一个控制器和操作来发布表单,但我不确定这是否可行。

    [ValidateRecaptcha]
    [HttpPost]
    public ViewResult PostGetInTouchForm(GetInTouchViewModel vm)
    {
        _logger.LogInformation("Starting PostGetInTouchForm routine");
        if (ModelState.IsValid)
        {
            _getInTouchService.SendGetInTouch(vm);
            ...redirect to thankyou page
        } else {
           ...what to do here? If I redirect, I lose the data posted
        }
        return View(vm);
    }
Run Code Online (Sandbox Code Playgroud)

我不知道在验证失败时该怎么做,以及如何将用户带回 GetInTouch 部分并输入他们输入的内容?或者,我可以用 AJAX 做些什么来保存表单的发布,直到 reCaptcha 得到验证,或者我是否不得不接受这样一个事实,即我必须为每个视图创建一个发布操作并且必须重复检查和电子邮件代码 30 + 次?

任何帮助表示赞赏!