/// <summary> /// 保存访问日志. /// </summary> /// <param name="log"></param> protected override void SaveTokenAccessLog(TokenAccessLog log) { using (MyTokenContext context = new MyTokenContext()) { context.TokenAccessLogs.Add(log); context.SaveChanges(); } }
/// <summary> /// 保存访问日志. /// </summary> /// <param name="log"></param> protected abstract void SaveTokenAccessLog(TokenAccessLog log);
/// <summary> /// 访问令牌. /// </summary> /// <param name="tokenID">Token ID</param> /// <param name="userData">用户数据</param> /// <param name="resultMsg">结果消息</param> /// <returns></returns> public TokenData AccessToken(Guid tokenID, Dictionary <string, object> userData, ref string resultMsg) { if (logger.IsDebugEnabled) { logger.DebugFormat(@"AccessToken(tokenID = {0}, userData = {1}) Start!", tokenID, userData); } // 令牌. TokenData result = null; // 令牌类型. TokenType tokenType = null; try { // 取得令牌. result = GetTokenData(tokenID); if (result == null) { resultMsg = "令牌不存在"; return(null); } // 取得令牌类型. tokenType = GetTokenType(result.TokenTypeCode); // 是否可用. if (!result.IsUseable) { resultMsg = "令牌超时"; return(null); } if (tokenType.AccessAbleTimesLimit > 0) { // 配置限制了单个令牌的可访问次数. if (result.AccessCount >= tokenType.AccessAbleTimesLimit) { resultMsg = "令牌使用次数超出限额"; return(null); } } // 访问次数递增. result.AccessCount++; // 保存令牌数据. SaveTokenData(result); resultMsg = SUCCESS_MESSAGE; if (!String.IsNullOrEmpty(result.UserData)) { result.UserDataObject = JsonConvert.DeserializeObject <Dictionary <string, object> >(result.UserData); } return(result); } catch (Exception ex) { logger.Error(ex.Message, ex); resultMsg = ex.Message; return(null); } finally { if (tokenType != null && tokenType.IsRequireAccessLog) { // 需要记录访问日志. TokenAccessLog accessLog = new TokenAccessLog(); // 令牌ID。 accessLog.TokenID = tokenID; // 访问时间. accessLog.AccessTime = DateTime.Now; // 用户数据, 以Json格式存储. if (userData != null) { accessLog.UserData = JsonConvert.SerializeObject(userData); } // 处理结果. accessLog.AccessResult = resultMsg; // 保存访问日志 SaveTokenAccessLog(accessLog); } if (logger.IsDebugEnabled) { logger.DebugFormat(@"AccessToken(tokenID = {0}, userData = {1}, resultMsg = {2}) Finish!", tokenID, userData, resultMsg); } } }
/// <summary> /// 判断生成的二维码,是否确认登录了. /// </summary> /// <returns></returns> public JsonResult IsLogin() { object loginData = Session["LOGIN_CODE"]; if (loginData == null) { // 失败. var errorResult = new { ResultCode = "LOGIN_CODE_NOT_FOUND", ResultMessage = "没有生成二维码页面!", }; return(Json(errorResult, JsonRequestBehavior.AllowGet)); } // 取得 Token. Guid token = (Guid)loginData; // 获取日志. List <TokenAccessLog> accessLog = this.tokenManager.GetTokenAccessLog(token); if (accessLog.Count == 0) { // 从未扫过. var errorResult = new { ResultCode = "LOGIN_CODE_INACTIVE", ResultMessage = "无效的二维码数据!", }; return(Json(errorResult, JsonRequestBehavior.AllowGet)); } if (accessLog.Count == 1) { // 只扫了一次,处于待确认状态. var errorResult = new { ResultCode = "LOGIN_CODE_WAITING", ResultMessage = "处于等待客户端确认状态下!", }; return(Json(errorResult, JsonRequestBehavior.AllowGet)); } TokenAccessLog resultData = accessLog.Last(); if (resultData.AccessResult != "success") { // 最后访问是失败的. var errorResult = new { ResultCode = "LOGIN_CODE_FAIL", ResultMessage = resultData.AccessResult, }; return(Json(errorResult, JsonRequestBehavior.AllowGet)); } // 未能获取 App 方面的用户数据. if (resultData.UserDataObject == null || resultData.UserDataObject["UserCode"] == null) { var errorResult = new { ResultCode = "LOGIN_CODE_FAIL", ResultMessage = "无效的用户数据", }; return(Json(errorResult, JsonRequestBehavior.AllowGet)); } // 访问成功的情况下. string userName = resultData.UserDataObject["UserCode"].ToString(); // 执行到这里, 认为登录成功了. FormsAuthentication.SetAuthCookie(userName, true); var successResult = new { ResultCode = "0", ResultMessage = "success" }; return(Json(successResult, JsonRequestBehavior.AllowGet)); }