public string Get(string str)
        {
            var method = str.ToLower();

            switch (method)
            {
            case "get":
            {
                var res = _provider.Get <string>("demo");
                return($"cached value : {res}");
            }

            case "getset":
            {
                var res = _provider.Get("demo", () => "1-456", TimeSpan.FromHours(1));
                return($"cached value : {res}");
            }

            case "set":
                _provider.Set("demo", "1-123", TimeSpan.FromHours(1));
                return("seted");

            case "remove":
                _provider.Remove("demo");
                return("removed");

            default:
                return("default");
            }
        }
Beispiel #2
0
        public void Set_And_Get_Should_Succeed()
        {
            var cacheKey = $"{_namespace}_{Guid.NewGuid().ToString()}";

            hybridCaching_1.Set(cacheKey, "val", TimeSpan.FromSeconds(30));

            var res = hybridCaching_1.Get <string>(cacheKey);

            Assert.Equal("val", res.Value);
        }
        public byte[]? Get(string key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            var result = _hybridCachingProvider.Get <byte[]>(key);

            return((!result.HasValue || result.IsNull) ? null : result.Value);
        }
        /// <summary>
        /// 检查token
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task <bool> CheckToken(HttpContext context)
        {
            var tokenTxt = await context.GetTokenAsync("access_token");

            var claimsInfo = GetClaimsInfo(tokenTxt);

            if (claimsInfo.Account.IsNotNullOrEmpty())
            {
                var tokenKey   = $"{tokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";
                var cahceToken = _cache.Get <string>(tokenKey).Value;
                return(cahceToken == claimsInfo.Token);
            }
            return(false);
        }
Beispiel #5
0
        public T Get(string key, string region)
        {
            var cacheKey = $"{region}:{key}";

            if (!_options.EnableHybrid)
            {
                var res = _provider.Get <T>(cacheKey);
                return(res.Value);
            }
            else
            {
                var res = _hybridProvider.Get <T>(region);
                return(res.Value);
            }
        }
 public string Get(int type = 1)
 {
     if (type == 1)
     {
         _provider.Remove("demo");
         return("removed");
     }
     else if (type == 2)
     {
         _provider.Set("demo", "123", TimeSpan.FromMinutes(1));
         return("seted");
     }
     else if (type == 3)
     {
         var res = _provider.Get("demo", () => "456", TimeSpan.FromMinutes(1));
         return($"cached value : {res}");
     }
     else
     {
         return("error");
     }
 }
Beispiel #7
0
        public async Task Invoke(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var endpoint = context.GetEndpoint();

            if (endpoint == null)
            {
                await _next(context);

                return;
            }

            var requiredValues = ((RouteEndpoint)endpoint).RoutePattern.RequiredValues;

            if (requiredValues.Count() == 0)
            {
                await _next(context);

                return;
            }

            var controller = requiredValues["controller"]?.ToString();
            var action     = requiredValues["action"]?.ToString();

            if (string.IsNullOrEmpty(controller))
            {
                await _next(context);

                return;
            }

            string tokenTxt        = string.Empty;
            string refreshTokenTxt = string.Empty;

            //读取Request
            //context.Request.EnableBuffering();
            //var requestReader = new StreamReader(context.Request.Body);
            //var requestContent = requestReader.ReadToEnd();
            //context.Request.Body.Position = 0;

            // Allow Anonymous skips all authorization
            if (endpoint?.Metadata.GetMetadata <IAllowAnonymous>() != null)
            {
                //如果是调用登陆API并且调用成功,需要保存accesstoken道cache
                if (string.Equals(controller, "account", StringComparison.InvariantCultureIgnoreCase) &&
                    (string.Equals(action, "login", StringComparison.InvariantCultureIgnoreCase) ||
                     string.Equals(action, "refreshaccesstoken", StringComparison.InvariantCultureIgnoreCase))
                    )
                {
                    string responseContent;

                    var originalBodyStream = context.Response.Body;

                    using (var fakeResponseBody = new MemoryStream())
                    {
                        context.Response.Body = fakeResponseBody;

                        await _next(context);

                        fakeResponseBody.Seek(0, SeekOrigin.Begin);
                        using (var reader = new StreamReader(fakeResponseBody))
                        {
                            responseContent = await reader.ReadToEndAsync();

                            fakeResponseBody.Seek(0, SeekOrigin.Begin);

                            await fakeResponseBody.CopyToAsync(originalBodyStream);
                        }
                    }

                    if (context.Response.StatusCode == 200)
                    {
                        tokenTxt        = JObject.Parse(responseContent).GetValue("token").ToString();
                        refreshTokenTxt = JObject.Parse(responseContent).GetValue("refreshToken").ToString();

                        var claimsInfo = GetClaimsInfo(tokenTxt);
                        if (!string.IsNullOrEmpty(claimsInfo.Account))
                        {
                            var key = $"{tokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";
                            //_cache.SetString(key, claimsInfo.Token, new DistributedCacheEntryOptions { AbsoluteExpiration = claimsInfo.Expire });
                            _cache.Set(key, claimsInfo.Token, claimsInfo.Expire - DateTime.Now);
                            var refreshTokenKey = $"{refreshTokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";
                            //_cache.SetString(refreshTokenKey, refreshTokenTxt, new DistributedCacheEntryOptions { AbsoluteExpiration = DateTime.Now.AddMinutes(_jwtConfig.RefreshTokenExpire) });
                            _cache.Set(refreshTokenKey, refreshTokenTxt, TimeSpan.FromSeconds(_jwtConfig.RefreshTokenExpire));
                        }
                    }
                }

                return;
            }


            tokenTxt = await context.GetTokenAsync("access_token");

            //如果是调用注销API并且调用成功,需要从cahce移除accesstoken
            if (string.Equals(controller, "account", StringComparison.InvariantCultureIgnoreCase) &&
                string.Equals(action, "logout", StringComparison.InvariantCultureIgnoreCase))
            {
                await _next(context);

                if (context.Response.StatusCode == 200)
                {
                    var claimsInfo = GetClaimsInfo(tokenTxt);
                    if (!string.IsNullOrEmpty(claimsInfo.Account))
                    {
                        var key             = $"{tokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";
                        var refreshTokenKey = $"{refreshTokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";

                        //可以考虑事务操作,以后再优化
                        _cache.Remove(key);
                        _cache.Remove(refreshTokenKey);
                    }
                }

                return;
            }

            //如果是其他需要授权的API并且调用成功,需要从检查accesstoken是否在缓存中。
            if (context.Response.StatusCode == 200)
            {
                var claimsInfo = GetClaimsInfo(tokenTxt);
                if (!string.IsNullOrEmpty(claimsInfo.Account))
                {
                    var key = $"{tokenPrefx}:{claimsInfo.Account}:{claimsInfo.Id}";
                    //var cahceToken = _cache.GetString(key);
                    var cahceToken = _cache.Get <string>(key).Value;
                    if (cahceToken != claimsInfo.Token)
                    {
                        await context.ForbidAsync();
                    }
                    else
                    {
                        await _next(context);
                    }
                }

                return;
            }
        }
        public ActionResult <IEnumerable <string> > Get()
        {
            var res = _hybrid.Get <string>("cacheKey");

            return(new string[] { "value1", "value2", res.Value });
        }