Exemplo n.º 1
0
        private TokenObjApiRequest GetMemoryCacheToken(string api_key)
        {
            TokenObjApiRequest tokenObj = null;
            bool tokenCacheIsNotNull    = memoryCache.TryGetValue(api_key, out tokenObj);

            return(tokenObj);
        }
Exemplo n.º 2
0
        private void SetMemoryCacheToken(string api_key, ApiResponse <TokenResultApiRequest> apiResponse)
        {
            TokenObjApiRequest tokenObj = apiResponse.Result.Obj.FirstOrDefault();

            bool expireDateIsNull = (string.IsNullOrWhiteSpace(tokenObj.ExpireDate));
            //根據來源設定過期時間
            DateTime expireTime = (expireDateIsNull) ? DateTime.Now.AddDays(15) : Convert.ToDateTime(tokenObj.ExpireDate);

            memoryCache.Set(api_key, tokenObj, new MemoryCacheEntryOptions().SetAbsoluteExpiration(expireTime));
        }
Exemplo n.º 3
0
        private bool TokenIsNotExpire(TokenObjApiRequest tokenData)
        {
            var result = true;

            if (string.IsNullOrWhiteSpace(tokenData.ExpireDate))
            {
                return(true);                                                //無過期日期值接回傳
            }
            if (DateTime.Now > Convert.ToDateTime(tokenData.ExpireDate))
            {
                result = false;
            }
            return(result);
        }
Exemplo n.º 4
0
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            bool requestTokenIsNull             = false;
            bool requestTokenIsEqualsCacheToken = false;

            //Domain來源
            context.HttpContext.Request.Headers.TryGetValue("Origin", out StringValues api_keyDatas);

            string tmpDomain     = $"{context.HttpContext.Request.Scheme }://{context.HttpContext.Request.Host}";
            string requestDomain = (!string.IsNullOrWhiteSpace(api_keyDatas.FirstOrDefault())) ? api_keyDatas.FirstOrDefault() : tmpDomain;

            //取得resquest token
            requestTokenIsNull = this.GetRequestHeaderData(context, out string api_key, out string token);

            if (requestTokenIsNull)
            {
                context.Result = this.SetContentResult(EnumApiStatus.API_ParameterError);
            }
            else
            {
                //取得相同api_key 的memoryToken
                TokenObjApiRequest cacheToken = this.GetMemoryCacheToken(api_key);

                //與memoryToken 判斷是否相同
                requestTokenIsEqualsCacheToken = this.RequestTokenEqualsMemoryCache(token, cacheToken?.Token);
                if (!requestTokenIsEqualsCacheToken)//不同
                {
                    //至TokenSystem以api_key與token 取得資料
                    ApiResponse <TokenResultApiRequest> apiResponse = VerifyTokenByTokenSystem(api_key, token);
                    if (apiResponse.Status == "0")
                    {
                        //將新token資料 存入memoryCache
                        this.SetMemoryCacheToken(api_key, apiResponse);
                        //重新取得CacheToken
                        cacheToken = this.GetMemoryCacheToken(api_key);
                    }
                    else
                    {
                        this.ClearMemoryCacheToken(api_key);
                        context.Result = this.SetContentResult((EnumApiStatus)Convert.ToInt32(apiResponse.Status));
                    }
                }
                else
                {
                    //以Domain來源判斷權限
                    bool clientDomainIsAllow = ClientDomainIsAllow(cacheToken.AllowList, requestDomain);
                    if (!clientDomainIsAllow)//權限不足
                    {
                        context.Result = this.SetContentResult(EnumApiStatus.NoAuth);
                    }
                    //判斷token是否過期
                    bool tokenIsNotExpire = TokenIsNotExpire(cacheToken);
                    if (!tokenIsNotExpire)//過期
                    {
                        context.Result = this.SetContentResult(EnumApiStatus.Token_Expire);
                    }
                }
            }

            base.OnActionExecuting(context);
        }