Esempio n. 1
0
 /// <summary>
 /// 保存访问日志.
 /// </summary>
 /// <param name="log"></param>
 protected override void SaveTokenAccessLog(TokenAccessLog log)
 {
     using (MyTokenContext context = new MyTokenContext())
     {
         context.TokenAccessLogs.Add(log);
         context.SaveChanges();
     }
 }
Esempio n. 2
0
 /// <summary>
 /// 保存访问日志.
 /// </summary>
 /// <param name="log"></param>
 protected abstract void SaveTokenAccessLog(TokenAccessLog log);
Esempio n. 3
0
        /// <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);
                }
            }
        }
Esempio n. 4
0
        /// <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));
        }