using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace System.Web.Mvc.Html
{
public static class ReCaptcha
{
//https://developers.google.com/recaptcha/docs/verify
public static MvcHtmlString ReCaptcha(this HtmlHelper helper, ReCaptchaModel.Theme theme = ReCaptchaModel.Theme.light)
{
var themeStr = theme != ReCaptchaModel.Theme.light ? " data-theme='" + theme.ToString() + "' " : "";
var sb = new StringBuilder();
sb.Append(helper.ValidationMessage("Captcha").ToString());
sb.Append("<script src='https://www.google.com/recaptcha/api.js' async defer></script>");
sb.Append("<div class='g-recaptcha'" + themeStr + " data-sitekey='" + Config.reCAPTCHA.SiteKey + "'></div>");
sb.Append("<noscript>");
sb.Append("<div style='width: 302px; height: 352px;'>");
sb.Append("<div style='width: 302px; height: 352px; position: relative;'>");
sb.Append("<div style='width: 302px; height: 352px; position: absolute;'>");
sb.Append("<iframe src='" + "https://www.google.com/recaptcha/api/fallback?k=" + Statics.reCAPTCHA.SiteKey + "'");
sb.Append("frameborder='0' scrolling='no'");
sb.Append("style='width: 302px; height:352px; border-style: none;'>");
sb.Append("</iframe>");
sb.Append("</div>");
sb.Append("<div style='width: 250px; height: 80px; position: absolute; border-style: none;");
sb.Append("bottom: 21px; left: 25px; margin: 0px; padding: 0px; right: 25px;'>");
sb.Append("<textarea id='g-recaptcha-response' name='g-recaptcha-response'");
sb.Append("class='g-recaptcha-response'");
sb.Append("style='width: 250px; height: 80px; border: 1px solid #c1c1c1;");
sb.Append("margin: 0px; padding: 0px; resize: none;' value=''>");
sb.Append("</textarea>");
sb.Append("</div>");
sb.Append("</div>");
sb.Append("</div>");
sb.Append("</noscript>");
return sb.ToMvcHtmlString();
}
}
}
namespace System.Web.Mvc
{
public class ReCaptchaModel
{
public bool success { get; set; }
public enum Theme
{
light,
dark
}
}
public static class ReCaptchaValidate
{
public static async Task<bool> ValidateReCaptcha(this Controller controller, bool autoAddModelStateError = true)
{
var recaptchaResponse = controller.Request.Form["g-recaptcha-response"];
bool succses = false;
if (!recaptchaResponse.IsNullOfEmpty())
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://www.google.com/recaptcha/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// New code:
HttpResponseMessage response = await client.GetAsync("api/siteverify?secret=" + Config.reCAPTCHA.SecretKey + "&response=" + recaptchaResponse);
if (response.IsSuccessStatusCode)
{
ReCaptchaModel CaptchResponse = await response.Content.ReadAsAsync<ReCaptchaModel>();
succses = CaptchResponse.success;
}
else
succses = false;
}
if (!succses && autoAddModelStateError)
controller.ModelState.AddModelError("Captcha", LangRess.PleaseProveYouAreHumain);
return succses;
}
}
}