【无私分享:从入门到精通ASP.NET MVC】从0开始,一块儿搭框架、作项目(5.5) 登陆功能的实现,完善登陆功能

索引html

【无私分享:从入门到精通ASP.NET MVC】从0开始,一块儿搭框架、作项目 目录索引

简述算法

今天咱们来完善咱们的登陆功能json

项目准备数组

咱们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5安全

但愿你们对ASP.NET MVC有一个初步的理解,理论性的东西咱们不作过多解释,有些地方不理解也不要紧,会用就好了,用的多了,用的久了,天然就理解了。cookie

项目开始框架

1、咱们先来丰富一下登陆页面

我随便从网上Down了个登陆页,你们能够套上本身的登陆页,咱们前面作了个简单的登陆页,只有用户名和密码,如今咱们增长一个验证码dom

首先,咱们新建个验证码的类 verify_code.cs  咱们就建在 Models文件夹下面吧ide

相信不少朋友都有验证码的生成类,这里只给新手朋友提供一下参考工具

验证码生成类

 1 using System.Drawing.Imaging;  2 using System.IO;  3 using System.Linq;  4 using System.Web;  5 
 6 namespace Models  7 {  8     /// <summary>
 9     /// 验证码构造类  10     /// add yuangang by 2015-05-10  11     /// </summary>
 12     public class verify_code  13  {  14         /// <summary>  
 15         /// 该方法用于生成指定位数的随机数  16         /// </summary>  
 17         /// <param name="VcodeNum">参数是随机数的位数</param>  
 18         /// <returns>返回一个随机数字符串</returns>  
 19         private string RndNum(int VcodeNum)  20  {  21             //验证码能够显示的字符集合 
 22             string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +
 23                 ",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +
 24                 ",R,S,T,U,V,W,X,Y,Z";  25             string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分红数组 
 26             string VNum = "";//产生的随机数 
 27             int temp = -1;//记录上次随机数值,尽可能避避免生产几个同样的随机数 
 28 
 29             Random rand = new Random();  30             //采用一个简单的算法以保证生成随机数的不一样 
 31             for (int i = 1; i < VcodeNum + 1; i++)  32  {  33                 if (temp != -1)  34  {  35                     rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类 
 36  }  37                 int t = rand.Next(61);//获取随机数 
 38                 if (temp != -1 && temp == t)  39  {  40                     return RndNum(VcodeNum);//若是获取的随机数重复,则递归调用 
 41  }  42                 temp = t;//把本次产生的随机数记录起来 
 43                 VNum += VcArray[t];//随机数的位数加一 
 44  }  45             return VNum;  46  }  47 
 48         /// <summary>  
 49         /// 该方法是将生成的随机数写入图像文件  50         /// </summary>  
 51         /// <param name="VNum">VNum是一个随机数</param>  
 52         public MemoryStream Create(out string VNum)  53  {  54             VNum = RndNum(4);  55             Bitmap Img = null;  56             Graphics g = null;  57             MemoryStream ms = null;  58             System.Random random = new Random();  59             //验证码颜色集合 
 60             Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };  61             //验证码字体集合 
 62             string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };  63 
 64 
 65             //定义图像的大小,生成图像的实例 
 66             Img = new Bitmap((int)VNum.Length * 18, 32);  67 
 68             g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象 
 69 
 70             g.Clear(Color.White);//背景设为白色  71 
 72             //在随机位置画背景点 
 73             for (int i = 0; i < 100; i++)  74  {  75                 int x = random.Next(Img.Width);  76                 int y = random.Next(Img.Height);  77                 g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);  78  }  79             //验证码绘制在g中 
 80             for (int i = 0; i < VNum.Length; i++)  81  {  82                 int cindex = random.Next(7);//随机颜色索引值 
 83                 int findex = random.Next(5);//随机字体索引值 
 84                 Font f = new System.Drawing.Font(fonts[findex], 15, System.Drawing.FontStyle.Bold);//字体 
 85                 Brush b = new System.Drawing.SolidBrush(c[cindex]);//颜色 
 86                 int ii = 4;  87                 if ((i + 1) % 2 == 0)//控制验证码不在同一高度 
 88  {  89                     ii = 2;  90  }  91                 g.DrawString(VNum.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符 
 92  }  93             ms = new MemoryStream();//生成内存流对象 
 94             Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中  95 
 96             //回收资源 
 97  g.Dispose();  98  Img.Dispose();  99             return ms; 100  } 101  } 102 }
View Code

好,咱们在AccountController.cs下面新建一个生成图片的二进制图片

好了,咱们能够在登陆页面插入这个图片

带验证码的完整的 登陆页面表单就行了

 

2、咱们增长验证码的功能

首先咱们获取一下表单验证码

而后咱们应该先判断一下 咱们的验证码图片是否过时 即 Session存储的验证码 是否存在

咱们在 Session存储的验证码没有过时 即 Session["gif"] != null 里面判断一下用户输入的验证码是否正确

咱们把咱们的登陆验证 方法 放到 用户验证码输入正确的方法体里面(若是用户输入的验证码不正确,咱们就没有必要验证用户信息了)

 

3、咱们修改一下咱们的验证方法

验证码没有过时,用户输入的验证码正确,这种状况下咱们就应该验证用户信息了,前几篇咱们已经写过验证功能了,咱们来修改完善一下

上一篇,咱们验证用户信息真实的状况下,咱们直接经过Json输出了 Status="y",可是咱们并无存储用户信息,今天咱们来修改一下这个方法存储用户信息,咱们经过两种方式,首先经过Session存储用户信息,而后把用户非关键信息加密后写入Cookies,当Session过时的时候,咱们就经过Cookies从新获取用户并存储用户信息,这是大体的流程 不少朋友会说这也不是很安全,是的,没有绝对的安全,软件是没有绝对的100%安全的,咱们只能在咱们需求的状况下作到本身最好的安全。

咱们在前一章写了个用户类Account 描述用户的详细信息,包括部门、权限、岗位、角色等 咱们经过用户基础表 来获取一下这些信息

var acconut = this.UserManage.GetAccountByUser(users);

写入当前用户到Session中

1 //写入Session 当前登陆用户
2 SessionHelper.SetSession("CurrentUser", acconut);

记录用户ID、登陆名、密码 到Cookies

1 //记录用户信息到Cookies
2  string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
3                                                  "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
4                                                  Session.SessionID + "\"}"; 5  CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),null);

咱们更新一下用户本次登陆的IP

1  //更新用户本次登陆IP
2  users.LastLoginIP = Utils.GetIP(); 3  UserManage.Update(users);

若是验证成功,咱们跳转到咱们的管理中心首页 

json.ReUrl = "/Sys/Home/Index";

这样,咱们的登陆就OK了

 

OK,下一篇咱们来作权限~~~

 

 

原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息
相关文章