通过Cookie存放用户登录信息以及安全性问题

场景

一个系统中需要用户登录,当用户登录之后,用一个全局变量存放用户信息,当用户执行一些Action的时候,需要先验证用户信息是否存在,如果存在则往下执行方法,如果不存在则跳转到登录界面。当用户点击退出系统或者关闭浏览器的时候,用户信息将被清除。

尝试1

采用编写一个Model存放用户信息

写一个UserInfo的Model存放用户信息,但是发现Controller每次访问一个新的Action的时候都会重新加载Controller,导致Controller访问的这个UserInfo类的信息每次都是null

尝试失败~

尝试2

采用Cookies存放用户信息

当用户进入登录界面,首先检测用户名密码是否正确,然后将信息存放到Cookies中

Response.Cookies["username"].Value = username;

退出系统时,则将Cookies的时间设置为负数,则Cookies则会被清除

Response.Cookies["username"].Expires = DateTime.Now.AddDays(-1);

这里要注意一下,我之前对Cookies设置了存活时间(这也是接触Cookies时候给自己留下的一个固话概念,Cookies就需要设置时长),我关闭了浏览器之后,我仍可以直接输入相关的Action的url,跳过登录步骤,也就是说Cookies还未清除。
原因是如果一个Cookies没有设置时间,则该Cookies是加载到内存中,当关闭浏览器时,Cookies也将清除;如果设置了时间,则会将Cookies存储到一个文件中,只要时间没到,即使关闭了浏览器,Cookies信息仍然存在。
这样做了之后,点击退出系统,以及点击关闭浏览器都能成功将Coolies信息清除,如果直接输入系统内部的url是无法进入,并跳转到登录界面。
但是存在一个问题,如果用户关闭页面,浏览器仍然未关闭,Cookies信息还是没有清除,这时候还是可以直接输入url并成功进入。
因此,我想到用javascript来监听关闭页面,在javascript中清除Cookies信息的方法。

第一步:绑定窗口关闭方法:

$(window).bind('beforeunload', function () {
    DelCookie("username");
});

第二步:
通过document.cookie方法获取所有cookies,根据key来得到需要删除的cookie,将该cookie设置截止时间为负数即可

function GetCookieValue(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
function DelCookie(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() + (-1 * 24 * 60 * 60 * 1000));
    var cval = GetCookieValue(name);
    document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}

这样就能够成功满足:
1 点击退出系统
2 关闭浏览器
3 关闭页面
就能够清除用户登录信息,直接输入系统内部url无法进入系统的需求。

你可能感兴趣的:(asp-net-mvc,前端)