很多的网站都会用到自动登录 ,比如淘宝新浪京东等等,
如何实现呢?毫无疑问将登录用户信息同时写入到Cookie与Session中
那具体向Cookie保存什么内容呢?
通常使用两种方式实现:我惯用第一种
把用户名与密码写入到客户端,密码保存在Cookie中存在很大的危险性,所以我们还需要针对密码进行加密【只保存用户名的话客户端有可能伪造Cookie实现登录】
密码加密后当让要求不能很容易的被识别被破解,
先说说咱自定义的加密规则:
1)随机产生一个两位的字母比如:AB
2)假设用户注册时的密码为:1243658561
3)那么向客户端保存的密码为:AB+MD5(AB+MD5(1243658561)) 这就是自定义的加密规则
当用户下次访问网站时 if(Cookie密码==AB+MD5(AB+MD5(数据库密码)){自动向Session中写入用户实体}
优点:任意电脑都可以实现记住我
缺点:安全性较差,用户信息暴露给客户端
第二种方法:
用户表添加一个字段比如:UserKey, 当用户选择自动登录时,生成一个Guid存入UserKey中同时写入Cookie中下次访问网站时if(Cookie中UserKey==数据库对应UserKey){自动向Session中写入用户实体}
优点:客户端没有任何用户资料,安全性较高
缺点:只能在一台电脑上实现记住我,更换电脑时会重写Guid,原电脑Cookie中Guid将失效
逻辑代码如下 细节代码省略自行填充
自定义规则
/// <summary> /// 将要写入Cookie的密码进行加密处理 /// </summary> /// <param name="pwd"> 密码</param> /// <param name="key"> 随即key</param> /// <returns> 加密后内容</returns> public string EncryPwd(string pwd, string key) { Random r = new Random(); //A:65 Z:90 //如果key为空随即产生两个字母 如果不为空直接使用 string salt; if(key == null || key == "") { salt = (( char)r.Next(65, 90)).ToString() + ((char )r.Next(65, 90)).ToString(); } else { salt = key; } string res = salt + MD5Compte(salt + MD5Compte(pwd)); return res; }
点击登录事件
protected void btnLogin_Click(object sender, ImageClickEventArgs e) { if(!Page.IsValid) { return; } string loginid = txtLoginId.Text.Trim(); string pwd = MD5Compte(txtLoginPwd.Text.Trim()); string msg = "" ; if(调用业务逻辑判断登录是否成功【代码省略】) { //返回true表示登录成功 //实现登录时 能够显示上一次登录成功的用户名 HttpCookie cLoginId = new HttpCookie( "loginId", loginUser.LoginId); cLoginId.Expires = DateTime.Now.AddYears(10); Response.Cookies.Add(cLoginId); Session[ "currUser"] = loginUser; if(cbAutoLogin.Checked) { //用户选中自动登录 我们就把用户信息写入磁盘(持久化Cookie) string encryPwd = this .EncryPwd(loginUser.LoginPwd); HttpCookie cpwd = new HttpCookie( "pwd", encryPwd); //设置过期时间 cpwd.Expires = DateTime.Now.AddYears(10); //写入Cookie Response.Cookies.Add(cpwd); } //登录成功 返回登录前页面或首页 } else { //登录错误信息提示 } }
MD5加密方法
public static string MD5Compte( string txt) { string str = "" ; MD5 md5 = MD5 .Create(); byte[] bytes = System.Text.Encoding .UTF8.GetBytes(txt);//字符串转Byte数组 byte[] results = md5.ComputeHash(bytes); for(int i = 0; i < results.Length; i++) { str = str + results[i].ToString( "X2");//X指将byte字符转换成为16进制 2指不足两位的前面加0 } return str; }
下次用户在此访问页面时在页面的Page_load中进行自动登录的判断
protected void Page_Load(object sender, EventArgs e) { //检测用户cookie是否存在 即用户是否选中自动登录 if(Request.Cookies["loginId" ] != null && Request.Cookies[ "pwd"] != null) { string cloginId = Request.Cookies["loginId" ].Value; string cpwd = Request.Cookies["pwd" ].Value; //调用业务逻辑 通过用户名loginId 获得用户实体loginUser 【代码省略】 if(loginUser != null ) { string sysPwd = EncryPwd(loginUser.LoginId, cpwd.Substring(0, 2)); if(sysPwd == cpwd && loginUser.UserState.Id == 1) { //loginUser.UserState.Id == 1判断用户状态为有效 Session[ "currUser"] = loginUser; //该用户可以自动登录 } } //用户可能为空 比如管理员删除该用户 但是客户端Cookie仍然存在 需要设置cookie过期 退出功能同样使用下句代码 Response.Cookies[ "pwd"].Expires = DateTime .Now.AddYears(-1); } //获取Cookie中上次登录用户名 if(!IsPostBack) { if(Response.Cookies["loginId" ] != null) { txtLoginId.Text = Response.Cookies[ "loginId"].Value; } } }
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>