Beispiel #1
0
        /// <summary>
        /// 判断单位时间内是否允许请求一个新的Token
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static bool ApplySucceed(LyciumToken token)
        {
            var nowTime = NowTimeStampSecond();
            var head    = token._applyTimeSpan.First;

            while (head != null)
            {
                if (nowTime - head.Value > token.ApplyTimeLimit)
                {
                    token._applyTimeSpan.Remove(head);
                }
                else
                {
                    break;
                }
                head = head.Next;
            }

            if (!IsIllegal(token))
            {
                token._applyTimeSpan.AddLast(nowTime);
                return(true);
            }
            else if (token.UseRollCheck)
            {
                token._applyTimeSpan.RemoveFirst();
                token._applyTimeSpan.AddLast(nowTime);
            }
            return(false);
        }
 public async Task <string> CheckToken(LyciumToken token)
 {
     if (IsLegal)
     {
         var localToken = _tokenService.GetToken(Uid, Gid);
         if (localToken == null)
         {
             return(null);
         }
         if (token.Content == localToken.Content)
         {
             return(JsonResult(localToken));
         }
         else
         {
             return(null);
         }
     }
     else
     {
         HttpContext.Response.StatusCode = 401;
         LyciumConfiguration.ReturnMessage(HttpContext, 4016, "主机校验不合法!");
         return(null);
     }
 }
Beispiel #3
0
 public static void Flush(LyciumToken token)
 {
     token.AliveTimeSpan = LyciumToken.GlobalAliveTimeSpan;
     token.FlushTimeSpan = LyciumToken.GlobalFlushTimeSpan;
     token.CreateTime    = NowTimeStampSecond();
     token.Content       = Guid.NewGuid().ToString();
 }
 public HttpStatusCode Modify(LyciumToken token)
 {
     if (_tokenService.ModifyToken(token))
     {
         return(HttpStatusCode.OK);
     }
     return(HttpStatusCode.InternalServerError);
 }
        public async Task <string> LoginToken()
        {
            if (IsLegal)
            {
                bool needAdd = false;
                //已经存在token
                var token = _tokenService.GetToken(Uid, Gid);
                if (token == null)
                {
                    needAdd   = true;
                    token     = new LyciumToken();
                    token.Uid = Uid;
                    token.Gid = Gid;
                }

                //重置 Token 内容
                TokenOperator.Flush(token);
                if (needAdd)
                {
                    //如果数据库没有则新增
                    if (_tokenService.AddToken(token))
                    {
                        //如果新增成功则发送通知
                        await _tokenNotify.NotifyTokensAdd(Gid, token);

                        return(JsonResult(token));
                    }
                    else
                    {
                        HttpContext.Response.StatusCode = 500;
                        LyciumConfiguration.ReturnMessage(HttpContext, 4017, "无法创建服务端Token,请联系管理员!");
                    }
                }
                else
                {
                    //如果数据库有则更新
                    if (_tokenService.ModifyToken(token))
                    {
                        //如果修改成功则发送通知
                        await _tokenNotify.NotifyTokensModify(Gid, token);

                        return(JsonResult(token));
                    }
                    else
                    {
                        HttpContext.Response.StatusCode = 401;
                        LyciumConfiguration.ReturnMessage(HttpContext, 4018, "无法更新服务端Token,请联系管理员!");
                    }
                }
            }
            else
            {
                HttpContext.Response.StatusCode = 401;
                LyciumConfiguration.ReturnMessage(HttpContext, 4016, "主机校验不合法!");
            }

            return(null);
        }
        /// <summary>
        /// 获取操作增量
        /// </summary>
        /// <param name="cid"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public TokenIncrement GetModifyIncrement(long cid, LyciumToken token)
        {
            var increment = new TokenIncrement();

            increment.OperatorType = 'u';
            increment.Uid          = token.Uid;
            increment.Gid          = token.Gid;
            increment.Cid          = cid;
            increment.CreateTime   = TokenOperator.NowTimeStampSecond();
            return(increment);
        }
Beispiel #7
0
        public override bool ModifyToken(LyciumToken token)
        {
            var result = _freeSql.Update <LyciumToken>().SetDto(token).Where(item => item.Uid == token.Uid && item.Gid == token.Gid).ExecuteAffrows() == 1;

            if (!result)
            {
                var tempToken = GetToken(token.Uid, token.Gid);
                if (tempToken == null)
                {
                    result = AddToken(token);
                }
            }
            return(result);
        }
        public override async Task NotifyTokensModify(long gid, LyciumToken token)
        {
            var hosts = _host.GetHostsUrlFromGroupId(gid);

            foreach (var item in hosts)
            {
                var result = await _request.Post <LyciumToken, HttpStatusCode>(item, "api/LyciumToken/modify", token);

                if (result == HttpStatusCode.InternalServerError)
                {
                    await _request.Post <LyciumToken, HttpStatusCode>(item, "api/LyciumToken/modify", token);
                }
            }
        }
        public async Task <string> RefreshToken(LyciumToken token)
        {
            if (IsLegal)
            {
                var localToken = _tokenService.GetToken(Uid, Gid);
                if (localToken == null)
                {
                    return(null);
                }
                if (token.Content == localToken.Content)
                {
                    if (TokenOperator.CanFlush(token))
                    {
                        TokenOperator.Flush(token);
                        if (_tokenService.ModifyToken(token))
                        {
                            await _tokenNotify.NotifyTokensModify(Gid, token);

                            return(JsonResult(token));
                        }
                        else
                        {
                            //二次重试
                            if (_tokenService.ModifyToken(token))
                            {
                                await _tokenNotify.NotifyTokensModify(Gid, token);

                                return(JsonResult(token));
                            }
                            else
                            {
                                HttpContext.Response.StatusCode = 500;
                                LyciumConfiguration.ReturnMessage(HttpContext, 4211, "服务端Token更新失败!");
                                return(null);
                            }
                        }
                    }
                }
                return(null);
            }
            else
            {
                HttpContext.Response.StatusCode = 401;
                LyciumConfiguration.ReturnMessage(HttpContext, 4016, "主机校验不合法!");
                return(null);
            }
        }
Beispiel #10
0
 public override void PutTokenToContext(HttpContext context, LyciumToken token)
 {
     context.Response.Headers[LyciumConfiguration.USER_TOKEN] = token.Content;
 }
 public abstract bool CheckToken(long uid, long gid, LyciumToken target);
Beispiel #12
0
 /// <summary>
 /// 该 Token 是否还存活
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 public static bool IsAlive(LyciumToken token)
 {
     return(NowTimeStampSecond() <= token.AliveTimeSpan + token.CreateTime);
 }
Beispiel #13
0
 /// <summary>
 /// 该 Token 能否进行刷新操作
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 public static bool CanFlush(LyciumToken token)
 {
     return(NowTimeStampSecond() <= token.FlushTimeSpan + token.CreateTime);
 }
Beispiel #14
0
 public override LyciumToken RefreshToken(LyciumToken token, long uid, long gid)
 {
     return(_request.Post <LyciumToken, LyciumToken>("api/LyciumToken/refresh", token, uid, gid).Result);
 }
Beispiel #15
0
 public override bool CheckToken(LyciumToken clientToken)
 {
     throw new NotImplementedException();
 }
 public abstract Task NotifyTokensModify(long gid, LyciumToken token);
 public abstract bool CheckToken(LyciumToken clientToken);
 public abstract bool ModifyToken(LyciumToken token);
 public abstract bool AddToken(LyciumToken token);
Beispiel #20
0
 public override bool AddToken(LyciumToken token)
 {
     RemoveToken(token.Uid, token.Gid);
     return(_freeSql.Insert(token).ExecuteAffrows() == 1);
 }
Beispiel #21
0
 public override bool CheckToken(long uid, long gid, LyciumToken target)
 {
     throw new NotImplementedException();
 }
Beispiel #22
0
 public override void ClearTokenFromContext(HttpContext context, LyciumToken token)
 {
     context.Response.Headers[LyciumConfiguration.USER_TOKEN] = "";
 }
Beispiel #23
0
 public override bool AddToken(LyciumToken token)
 {
     return(_freeSql.Insert(token).ExecuteAffrows() == 1);
 }
 /// <summary>
 /// 移除Token
 /// </summary>
 /// <param name="context"></param>
 /// <param name="token"></param>
 public abstract void ClearTokenFromContext(HttpContext context, LyciumToken token);
Beispiel #25
0
 public override bool ModifyToken(LyciumToken token)
 {
     return(_freeSql.Update <LyciumToken>().SetDto(token).Where(item => item.Uid == token.Uid && item.Gid == token.Gid).ExecuteAffrows() == 1);
 }
 public abstract LyciumToken RefreshToken(LyciumToken tokens, long uid, long gid);
 /// <summary>
 /// 将Token推到HttpContext中
 /// </summary>
 /// <param name="httpContext"></param>
 /// <param name="token"></param>
 public abstract void PutTokenToContext(HttpContext context, LyciumToken token);
Beispiel #28
0
 /// <summary>
 /// 是否是超过了请求次数
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 public static bool IsIllegal(LyciumToken token)
 {
     return(token._applyTimeSpan.Count >= token.ApplyCountterLimit);
 }