/******************************************************************************* * Copyright © 2016 HT.Cloud.Framework 版权所有 * Author: HT.Cloud * Description: WaterCloud快速开发平台 * Website: *********************************************************************************/ using System; using System.Collections.Generic; using System.Threading.Tasks; namespace HT.Cloud.Code { public class OperatorProvider { //是否允许一个账户在多处登录 private static bool LoginMultiple = GlobalContext.SystemConfig.LoginMultiple; //缓存过期时间 private static int LoginExpire = GlobalContext.SystemConfig.LoginExpire; private static string projectPrefix = GlobalContext.SystemConfig.ProjectPrefix; public static OperatorProvider Provider { get { return new OperatorProvider(); } } //watercloud_operator_pc_ PC端登录 //watercloud_operator_info_ 登录次数 // /// /// 缓存操作类 /// private string cacheKeyOperator = projectPrefix + "_operator_";// +登录者token private string cacheKeyToken = projectPrefix + "_token_";// +登录者token private string cacheKeyError = projectPrefix + "_error_";// + Mark /// /// 秘钥 /// private string LoginUserToken = projectPrefix + "_Token"; /// /// 标记登录的浏览器 /// private string LoginUserMarkKey = projectPrefix + "_Mark"; public string GetProvider(string key) { var token = GetToken(); if (!string.IsNullOrEmpty(token)) return token; token = WebHelper.GetCookie(key).ToString(); if (!string.IsNullOrEmpty(token)) return token; return WebHelper.GetSession(key).ToString(); } public void SetProvider(string key, string value) { WebHelper.WriteCookie(key, value); WebHelper.WriteSession(key, value); } public string GetToken() { try { if (GlobalContext.HttpContext == null) { return null; } //查请求头 string token = GlobalContext.HttpContext.Request.Headers[GlobalContext.SystemConfig.TokenName].ParseToString(); if (!String.IsNullOrEmpty(token)) return token; //查参数 token = GlobalContext.HttpContext.Request.Query[GlobalContext.SystemConfig.TokenName]; if (!String.IsNullOrEmpty(token)) return token; //查cookies string cookie = GlobalContext.HttpContext.Request.Cookies[GlobalContext.SystemConfig.TokenName]; return cookie == null ? string.Empty : cookie; } catch (Exception) { return null; } } public void RemoveProvider(string key) { WebHelper.RemoveCookie(key); WebHelper.RemoveSession(key); } public OperatorModel GetCurrent() { OperatorModel operatorModel = new OperatorModel(); try { string loginMark = GetProvider(LoginUserMarkKey); operatorModel = CacheHelper.Get(cacheKeyOperator + loginMark); } catch { operatorModel = null; } return operatorModel; } /// /// 获取浏览器设配号 /// /// public string GetMark() { string cookieMark = GetProvider(LoginUserMarkKey); if (string.IsNullOrEmpty(cookieMark)) { cookieMark = Guid.NewGuid().ToString(); SetProvider(LoginUserMarkKey, cookieMark); } return cookieMark; } /// /// 登录者信息添加到缓存中 /// /// 用户 /// 设备标识uid /// 设备类型 /// 是否保存cookie,默认是 /// public async Task AddLoginUser(OperatorModel operatorModel, string loginMark, string facilityMark) { string token = Guid.NewGuid().ToString(); try { // 填写登录信息 operatorModel.LoginToken = token; //登录信息更新 if (string.IsNullOrEmpty(loginMark)) { string cookieMark = GetProvider(LoginUserMarkKey); if (string.IsNullOrEmpty(cookieMark)) { operatorModel.loginMark = Guid.NewGuid().ToString(); SetProvider(LoginUserMarkKey, operatorModel.loginMark); } else { operatorModel.loginMark = cookieMark; } SetProvider(LoginUserToken, token); } else { operatorModel.loginMark = loginMark; RemoveProvider(LoginUserMarkKey); } //redis 登录token列表更新 Dictionary tokenMarkList = await CacheHelper.GetAsync>(cacheKeyToken + operatorModel.UserId); if (tokenMarkList == null)// 此账号第一次登录 { tokenMarkList = new Dictionary(); tokenMarkList.Add(operatorModel.loginMark, token); } else { if (tokenMarkList.ContainsKey(operatorModel.loginMark)) { tokenMarkList[operatorModel.loginMark] = token; } else { tokenMarkList.Add(operatorModel.loginMark, token); } } await CacheHelper.SetAsync(cacheKeyToken + operatorModel.UserId, tokenMarkList); await CacheHelper.SetAsync(cacheKeyOperator + operatorModel.loginMark, operatorModel, LoginExpire); await CacheHelper.RemoveAsync(cacheKeyOperator + facilityMark + operatorModel.UserId); await CacheHelper.SetAsync(cacheKeyOperator + facilityMark + operatorModel.UserId, token, LoginExpire); return token; } catch (Exception) { throw; } } /// /// 清空当前登录信息 /// /// apitoken /// 设备类型 public async Task EmptyCurrent(string facilityMark) { try { string token = GetProvider(LoginUserToken); string loginMark = GetProvider(LoginUserMarkKey); await EmptyCurrent(token, facilityMark, loginMark); RemoveProvider(LoginUserMarkKey.Trim()); RemoveProvider(LoginUserToken.Trim()); } catch (Exception) { } } /// /// 清空当前登录信息 /// /// 登录票据 /// 登录设备 /// 登录设备标识 public async Task EmptyCurrent(string token, string facilityMark, string loginMark) { try { OperatorModel operatorInfo = await CacheHelper.GetAsync(cacheKeyOperator + loginMark); if (operatorInfo != null) { Dictionary tokenMarkList = await CacheHelper.GetAsync>(cacheKeyToken + operatorInfo.UserId); tokenMarkList.Remove(loginMark); await CacheHelper.RemoveAsync(cacheKeyOperator + loginMark); if (operatorInfo.LoginToken == token || facilityMark == "api_") { await CacheHelper.RemoveAsync(cacheKeyOperator + facilityMark + operatorInfo.UserId); } await CacheHelper.SetAsync(cacheKeyToken + operatorInfo.UserId, tokenMarkList); await CacheHelper.RemoveAsync(facilityMark + GlobalContext.SystemConfig.TokenName + "_" + operatorInfo.UserId + "_" + operatorInfo.LoginTime); } } catch (Exception) { } } /// /// 判断登录状态 /// /// 登录设备 /// apitoken /// -1未登录,1登录成功,0登录过期,-2账号被顶 public async Task IsOnLine(string facilityMark) { try { string token = GetProvider(LoginUserToken); string loginMark = GetProvider(LoginUserMarkKey); return await IsOnLine(token, facilityMark, loginMark); } catch (Exception) { return new OperatorResult { stateCode = -1 }; } } /// /// 判断登录状态 /// /// 登录票据 /// 登录设备 /// 登录设备标识 /// -1未登录,1登录成功,0登录过期,-2账号被顶 public async Task IsOnLine(string token, string facilityMark, string loginMark) { OperatorResult operatorResult = new OperatorResult(); operatorResult.stateCode = -1; // -1未登录,1登录成功,0登录过期 try { if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(loginMark)) { return operatorResult; } OperatorModel operatorInfo = await CacheHelper.GetAsync(cacheKeyOperator + loginMark); if (operatorInfo != null) { Dictionary tokenMarkList = await CacheHelper.GetAsync>(cacheKeyToken + operatorInfo.UserId); if ((token == operatorInfo.LoginToken || facilityMark == "api_") && tokenMarkList.ContainsKey(operatorInfo.loginMark) && tokenMarkList[operatorInfo.loginMark] == operatorInfo.LoginToken) { ////账号被顶(排除admin) if (!LoginMultiple && !operatorInfo.IsSuperAdmin && operatorInfo.LoginToken != await CacheHelper.GetAsync(cacheKeyOperator + facilityMark + operatorInfo.UserId)) { operatorResult.stateCode = -2; tokenMarkList = await CacheHelper.GetAsync>(cacheKeyToken + operatorInfo.UserId); tokenMarkList.Remove(loginMark); await CacheHelper.SetAsync(cacheKeyToken + operatorInfo.UserId, tokenMarkList); await CacheHelper.RemoveAsync(cacheKeyOperator + loginMark); } else { operatorResult.userInfo = operatorInfo; operatorResult.stateCode = 1; await CacheHelper.ExpireAsync(cacheKeyOperator + loginMark, LoginExpire); await CacheHelper.ExpireAsync(cacheKeyOperator + facilityMark + operatorInfo.UserId, LoginExpire); await CacheHelper.ExpireAsync(facilityMark + GlobalContext.SystemConfig.TokenName + "_" + operatorInfo.UserId + "_" + operatorInfo.LoginTime, LoginExpire); } } } return operatorResult; } catch (Exception) { return operatorResult; } } #region 登录错误次数记录 /// /// 获取当前登录错误次数 /// /// public async Task GetCurrentErrorNum() { int res = 0; try { string cookieMark = GetProvider(LoginUserMarkKey); if (string.IsNullOrEmpty(cookieMark)) { cookieMark = Guid.NewGuid().ToString(); SetProvider(LoginUserMarkKey, cookieMark); } string num = await CacheHelper.GetAsync(cacheKeyError + cookieMark); if (!string.IsNullOrEmpty(num)) { res = Convert.ToInt32(num); } } catch (Exception) { } return res; } /// /// 增加错误次数 /// /// public async Task AddCurrentErrorNum() { int res = 0; try { string cookieMark = GetProvider(LoginUserMarkKey); if (string.IsNullOrEmpty(cookieMark)) { cookieMark = Guid.NewGuid().ToString(); SetProvider(LoginUserMarkKey, cookieMark); } string num = await CacheHelper.GetAsync(cacheKeyError + cookieMark); if (!string.IsNullOrEmpty(num)) { res = Convert.ToInt32(num); } res++; num = res + ""; await CacheHelper.SetAsync(cacheKeyError + cookieMark, num, 24); } catch (Exception) { } return res; } /// /// 清除当前登录错误次数 /// public async Task ClearCurrentErrorNum() { try { string cookieMark = GetProvider(LoginUserMarkKey); if (string.IsNullOrEmpty(cookieMark)) { cookieMark = Guid.NewGuid().ToString(); SetProvider(LoginUserMarkKey, cookieMark); } await CacheHelper.RemoveAsync(cacheKeyError + cookieMark); } catch (Exception) { } } #endregion 登录错误次数记录 } }