/*******************************************************************************
* 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 登录错误次数记录
}
}