代码段之自动登录

很多的网站都会用到自动登录 ,比如淘宝新浪京东等等,

 

如何实现呢?毫无疑问将登录用户信息同时写入到CookieSession

那具体向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(CookieUserKey==数据库对应UserKey){自动向Session中写入用户实体}

优点:客户端没有任何用户资料,安全性较高

缺点:只能在一台电脑上实现记住我,更换电脑时会重写Guid,原电脑CookieGuid将失效

 

逻辑代码如下  细节代码省略自行填充

自定义规则 

/// <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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值