用redis和cookie做单用户登录
因为公司的项目需要用到单用户登录,于是今天用redis和cookie给系统添加了单用户登录功能,再次简单记录一下。
单用户登录是为了防止同一账户在不同电脑和不同浏览器里面同时登录。所以我这边的思路是:
1.用户登录A账号时,获取A账号信息和当前浏览器cookie里面的token信息结合起来存到redis数据库。
2.有其他用户登录A账号,更新redis里面的用户信息和token信息,以最后一次登录为准。
3.写拦截器拦截每个请求,在处理请求时,判断当前用户信息与token数据和redis里面的数据是否一致,如果不一致,则说明该账号在别的地方登陆过,则会提示重新登录。
代码如下:
在用户登录的方法里,写如下代码:将用户登录信息与浏览器token数据存入redis数据库
//更新redis里面的用户登录信息 string userid = userEntity.F_UserId; string companyId = userEntity.F_CompanyId; string token =Request.Cookies["__RequestVerificationToken"].Value.ToString(); cache.Remove(cache_userloginid + userid, CacheId.loginInfo); UserLoginEntity userLogin = new UserLoginEntity(); userLogin.UserLoginID = userid + "_" + companyId + "_" + token; TimeSpan cacheTime = TimeSpan.FromDays(1); cache.Write<UserLoginEntity>(cache_userloginid + userid, userLogin, cacheTime, CacheId.loginInfo);
写拦截器,在每次请求时判断当前用户信息与token数据和redis里面的数据是否一致,根据结果做出反应
public override void OnActionExecuting(ActionExecutingContext filterContext) { // 判断当前登录信息是否存在 string userid = LoginUserInfo.Get() == null ? "" : LoginUserInfo.Get().userId; string companyId = LoginUserInfo.Get() == null ? "" : LoginUserInfo.Get().companyId; string token = HttpContext.Current.Request.Cookies["__RequestVerificationToken"] == null ? "" : HttpContext.Current.Request.Cookies["__RequestVerificationToken"].Value.ToString(); UserLoginEntity userLogin = cache.Read<UserLoginEntity>(cache_userloginid + userid, CacheId.loginInfo); if (userLogin != null) { //有用户登陆中 string userLoginId = userLogin.UserLoginID; //redis中保存的用户登录标识 string myuserLoginId = userid + "_" + companyId + "_" + token; if (userLoginId != myuserLoginId) { //两个用户标识不一样 filterContext.Result = new ContentResult() { Content = "<script>" + "if(confirm('你的账号已在别处登陆,是否返回登陆页面?')){window.location.href='/Login/Index';}else{window.close();}</script>" }; } } base.OnActionExecuting(filterContext); }
如果信息不一致,则说明在之后还有人登陆过该账号,则会弹出提示:
以上就是我做这个功能的思路以及部分代码。