www.google.com/recaptcha
code.google.com/apis/recaptcha
www.google.com/recaptcha/api/verify
RecaptchaController Class
\controllers\recaptcha\recaptchaController.cs
using System.Web.Mvc; namespace ExpressionSoftware.Controllers { public class RecaptchaController : Controller { //******************************************************** // PRIVATE DATA - DO NOT HARDCODE const string RECAPTCHA_PRIVATE_KEY = "----------"; const string EMAIL_ADDRESS = "john@email.com"; //******************************************************** const string RECAPTCHA_VERIFY_URL = "http://www.google.com/recaptcha/api/verify"; [AcceptVerbs(HttpVerbs.Get)] public ViewResult Default() { return View(); } [AcceptVerbs(HttpVerbs.Post)] public string Default(FormCollection formValues) { string result = "fail"; //do not submit recaptcha if form vars are null/empty if (!(string.IsNullOrEmpty(formValues["recaptcha_challenge_field"]) || string.IsNullOrEmpty(formValues["recaptcha_response_field"]))) { //alt - validate using web service var recaptcha = new ExpressionSoftware.Recaptcha() { PrivateKey = RECAPTCHA_PRIVATE_KEY, VerifyUrl = RECAPTCHA_VERIFY_URL }; if (recaptcha.Validate(Request.UserHostAddress, formValues["recaptcha_challenge_field"], formValues["recaptcha_response_field"])) { result = EMAIL_ADDRESS; //captcha test passed, show email address } } return result; } } }
\views\recaptcha\default.cshtml
<h2>reCAPTCHA Demo for ASP.NET MVC 3</h2> @using (Html.BeginForm()) { <input id="b1" type="button" value="Show CAPTCHA" /> <a id="email" /> <div id="captchaDiv"></div> <input id="submit" type="submit" value="Submit" style="display:none;"/> <label id="error" style="display:none;">Invalid input, please try again.</label> } <script src="//ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js" type="text/javascript"></script> <script src="//www.google.com/recaptcha/api/js/recaptcha_ajax.js" type="text/javascript"></script> <script src="/js/recaptcha.js" type="text/javascript"></script>
\js\recaptcha.js
$(document).ready(function() { $("form").submit( function(event) { event.preventDefault(); submit(this, updateUI, "html"); }); $("#b1").click(showCaptcha); }); function submit(form, callback, format) { $.ajax({url: form.action, type: form.method, dataType: format, data: $(form).serialize(), success: callback }); } function updateUI(result) { result = $.trim(result); if (result == "fail") { $("#error").show(); Recaptcha.reload(); Recaptcha.focus_response_field(); } else { //success $("#email").text(result); $("#email")[0].href = "mailto:"+result; $("#captchaDiv").hide(); $("#submit").hide(); $("#error").hide(); } } function showCaptcha() { Recaptcha.create("6LdXGMISAAAAAKbqYwaabU7h1qjwGYEXoEelZjWV", //api public key "captchaDiv", { theme: "clean", callback: Recaptcha.focus_response_field } ); $("#b1").hide(); $("#submit").show(); return false; }
Recaptcha Class / Web Service
recaptcha.cs
using System.IO; using System.Net; using System.Text; namespace ExpressionSoftware { public class Recaptcha { public string VerifyUrl { get; set; } public string PrivateKey { get; set; } public bool Validate(string remoteIP, string captchaChallenge, string captchaResponse) { bool result = false; string response = GetWebResponse(remoteIP, captchaChallenge, captchaResponse); result = response.ToLower().StartsWith("true"); //api response line 1 value: true or false return result; } string GetWebResponse(string remoteIP, string captchaChallenge, string captchaResponse) { string result = null; //convert params to byte array var parameters = string.Format("privatekey={0}&remoteip={1}&challenge={2}&response={3}", PrivateKey, remoteIP, captchaChallenge, captchaResponse); byte[] paramData = Encoding.UTF8.GetBytes(parameters); var request = (HttpWebRequest)WebRequest.Create(VerifyUrl); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = paramData.Length; request.ServicePoint.Expect100Continue = false; //write param data to request stream using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(paramData, 0, paramData.Length); requestStream.Close(); } using (WebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { using (StreamReader responseReader = new StreamReader(stream)) { result = responseReader.ReadToEnd(); responseReader.Close(); } stream.Close(); } response.Close(); } return result; } } }
No comments:
Post a Comment