当用户填写表单时,防止自动化脚本恶意提交表单的一种有效方式是通过验证码来验证用户的身份。下面是一个ASP.NET MVC验证码功能实现的完整攻略。
步骤一:在视图中添加验证码
添加一个表单或者用户输入数据的其他元素,然后在元素下方放置一个图片框来显示验证码的图片。图片框应该包含一个用于输入验证码的文本输入框,和一个刷新验证码的按钮。下面是一个示例:
<form action="/Home/Login" method="post">
<label for="Username">用户名:</label>
<input type="text" name="Username" id="Username" /><br />
<label for="Password">密码:</label>
<input type="password" name="Password" id="Password" /><br />
<label for="Captcha">验证码:</label>
<input type="text" name="Captcha" id="Captcha" />
<img src="/Home/GenerateCaptcha" />
<a href="#" onclick="document.querySelector('img').src = '/Home/GenerateCaptcha?_=' + Math.random();return false;">换一张</a>
<br />
<input type="submit" value="登录" />
</form>
步骤二:在控制器中生成验证码图像
首先,我们需要创建一个返回验证码图片的控制器动作。下面这个示例代码,可以生成一个包含4个数字的验证码图片,并将其输出为JPEG格式的图像流。
public ActionResult GenerateCaptcha()
{
var captchaValue = "";
var random = new Random();
for (var i = 0; i < 4; i++)
{
captchaValue += random.Next(9).ToString();
}
var bitmap = new Bitmap(80, 30);
var graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.LightGray);
graphics.DrawString(captchaValue, new Font("Arial", 14), Brushes.Black, new PointF(10, 5));
graphics.DrawLine(Pens.Gray, new Point(0, 0), new Point(bitmap.Width - 1, 0));
graphics.DrawLine(Pens.Gray, new Point(0, 0), new Point(0, bitmap.Height - 1));
graphics.DrawLine(Pens.Gray, new Point(0, bitmap.Height - 1), new Point(bitmap.Width - 1, bitmap.Height - 1));
graphics.DrawLine(Pens.Gray, new Point(bitmap.Width - 1, 0), new Point(bitmap.Width - 1, bitmap.Height - 1));
Response.ContentType = "image/jpeg";
bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
graphics.Dispose();
bitmap.Dispose();
Session["captcha"] = captchaValue;
return null;
}
上面这个示例使用了Bitmap和Graphics类来创建一个位图,然后使用Graphics对象来绘制字体、线条和背景。最后将位图输出为JPEG格式的图像流。在输出图像流的同时,我们保存了验证码的值到Session中,以便在表单提交时进行验证。
步骤三:在控制器中验证验证码
当用户提交表单时,我们需要从表单中读取验证码的值,然后与Session中保存的验证码进行比较。下面的示例代码演示了如何进行验证码的验证。
[HttpPost]
public ActionResult Login(string username, string password, string captcha)
{
var expectedCaptcha = (string)Session["captcha"];
if (captcha != expectedCaptcha)
{
ModelState.AddModelError("captcha", "验证码错误");
}
if (ModelState.IsValid)
{
// 验证用户名和密码
// 如果验证成功,返回OK
return Content("OK");
}
else
{
return View();
}
}
上面这个示例代码首先从Session中读取保存的验证码,然后与表单中提交的验证码进行比较。如果验证码不匹配,我们将ModelState的“captcha”字段设置为一个“验证码错误”的错误消息。最后检查ModelState的IsValid字段是否为true,如果为true则表示所有验证都通过。如果IsValid为false,则表示有一个或多个验证失败,我们将返回原始登录视图,并显示错误消息。
示例说明
示例一:图形验证码
在表单中添加了一个图形验证码,用于验证用户的身份。在用户访问登录页面时,会自动生成一个验证码的图像,并显示在页面上。每次刷新页面或点击“换一张”按钮时,会生成一个新的验证码,以防止自动化程序攻击。
示例二:服务器端验证
在控制器中对验证码进行验证,如果验证码验证失败,则向页面添加一个错误模型,告诉用户验证码不正确。如果用户名和密码验证失败,则显示相应的错误消息。如果所有验证都通过,则返回“OK”字符串作为响应结果。
以上是ASP.NET MVC验证码功能实现的完整攻略。以上示例代码仅供参考,实际开发中,你需要根据具体的需求对代码进行调整,并确保代码的安全性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET MVC验证码功能实现代码 - Python技术站