简述
本文转自http://yuangang.cnblogs.com并加以整理。 今天我们来完善登录功能
索引
项目开始
一、登录页面增加验证码
我们前面做了个简单的登录页,只有用户名和密码,现在我们增加一个验证码。
首先,原作者新建的验证码类verify_code.cs放在Models文件夹下面。我认为这个类放在Common类库要比Models要好,并且修改命名为Captcha。
知识小百科:全自动区分计算机和人类的公開图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗称验证码,是一种区分用户是计算机或人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
1 | using System; |
在AccountController.cs下面新建一个生成图片的二进制图片
1 | /// <summary> |
然后在登录页面插入这个图片,放在登陆按钮之前。this.src+?是为了防止缓存,在点击图片是让浏览器发送新的请求,当然也有很多其他的方法,只要让每次url地址querystring不同就可以。
1 | <div class="from-control"> |
带验证码的完整登录页面表单就好了。
二、增加验证码的功能
- 首先获取一下表单验证码
string code = Request.Form["code"];
- 然后判断验证码图片是否过期,即 Session存储的验证码是否存在
if (Session["gif"] != null)
- 在Session存储的验证码没有过期,即Session[“gif”] != null里面判断一下用户输入的验证码是否正确
if (!string.IsNullOrEmpty(code) && code.ToLower() == Session["gif"].ToString().ToLower())
把登录验证方法放到用户验证码输入正确的方法体里面(如果用户输入的验证码不正确,就没有必要验证用户信息了)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57/// <summary>
/// 登录验证
/// </summary>
[ValidateAntiForgeryToken]
public ActionResult Login(Domain.SYS_USER item)
{
var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
try
{
//获取表单验证码
string code = Request.Form["code"];
if (Session["gif"] != null)
{
if (!string.IsNullOrEmpty(code) && code.ToLower() == Session["gif"].ToString().ToLower())
{
//调用登录验证接口 返回用户实体类
var user = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
if (user != null)
{
//是否锁定
if (user.ISCANLOGIN == 1)
{
json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
return Json(json);
}
json.Status = "y";
log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
}
else
{
json.Msg = "用户名或密码不正确";
log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
}
}
else
{
json.Msg = "验证码不正确";
log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
}
}
else
{
json.Msg = "验证码已过期,请刷新验证码";
log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
}
}
catch (Exception e)
{
json.Msg = e.Message;
log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
}
return Json(json, JsonRequestBehavior.AllowGet);
}
三、修改验证方法
验证码没有过期且用户输入的验证码正确,这种情况下就应该验证用户信息了。
上一篇,我们验证用户信息真实的情况下,直接通过Json输出了Status=”y”,但是并没有存储用户信息。现在我们分两步来存储用户,首先通过Session存储,然后把用户非关键信息加密后写入Cookies,当Session过期的时候,通过Cookies重新获取用户并存储用户信息。这是大致的流程,很多朋友会说这也不是很安全,是的,软件是没有绝对的100%安全的,我们只能做到自己最好的安全。
在前一章用户类Account描述了用户的详细信息,包括部门、权限、岗位、角色等。在是否锁定那个if语句后面,我们开始写下面的代码。通过用户基础表来获取一下这些信息:
var account = this.UserManage.GetAccountByUser(user);
写入当前用户到Session中
1
2//写入Session 当前登录用户
SessionHelper.SetSession("CurrentUser", account);记录用户ID、登录名、密码到Cookie
1
2
3
4//记录用户信息到Cookies
string cookieValue = "{\"id\":\"" + account.Id + "\",\"username\":\"" + account.LogName + "\",\"password\":\"" + account.PassWord + "\",\"ToKen\":\"" + Session.SessionID + "\"}";
CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookieValue),null);更新用户本次登录的IP
1
2
3//更新用户本次登录IP
user.LastLoginIP = Utils.GetIP();
UserManage.Update(user);如果验证成功,跳转到管理中心首页
json.ReUrl = "/Sys/Home/Index";
这样,我们的登录就OK了。