예제 #1
0
        public IActionResult GetTodoItems()
        {
            // Nhận Token rồi xét Token có trong Redis không.
            string authHeader = HttpContext.Request.Headers["Authorization"];

            string[]        TokenArray = authHeader.Split(" ");
            var             llen       = _database.ListLength("mylist");
            var             lindex     = _database.ListGetByIndex("mylist", llen - 1);
            object          data       = new object();
            List <TodoItem> todoItem   = new List <TodoItem>();
            Connect         kn         = new Connect();

            kn.kn_CSDL();

            // Đọc JWT rồi convert để lấy roles
            var stream      = TokenArray[1];
            var handler     = new JwtSecurityTokenHandler();
            var tokenS      = handler.ReadToken(stream) as JwtSecurityToken;
            var jsonPayload = tokenS.Payload.SerializeToJson();

            Roles roles = new Roles();

            roles = JsonConvert.DeserializeObject <Roles>(jsonPayload);
            // Nếu Token có trong Redis
            if (lindex == TokenArray[1])
            {
                // Nếu list Redis lớn hơn 2 thì xóa 1
                if (llen >= 2)
                {
                    _database.ListLeftPop("mylist");
                }
                todoItem = kn.knoi.Query <TodoItem>("GetAll",
                                                    commandType: CommandType.StoredProcedure).ToList();

                // Tạo một Token mới
                var tokenHandler    = new JwtSecurityTokenHandler();
                var key             = Encoding.ASCII.GetBytes(_appSettings.Secret);
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = new ClaimsIdentity(new Claim[]
                    {
                        new Claim(ClaimTypes.Role, roles.Role),
                    }),
                    Expires            = DateTime.UtcNow.AddDays(7),
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                };
                var    token      = tokenHandler.CreateToken(tokenDescriptor);
                string fullbearer = tokenHandler.WriteToken(token);
                _database.ListRightPush("mylist", fullbearer);
                // Trả về danh sách item + token mới
                data = new
                {
                    token    = fullbearer,
                    todoitem = todoItem
                };
            }
            return(Ok(data));
        }
 /// <summary>
 /// 移除并返回存储在该键列表的第一个元素
 /// </summary>
 /// <param name="redisKey"></param>
 /// <returns></returns>
 public string ListLeftPop(string redisKey)
 {
     redisKey = GetKeyForRedis(redisKey);
     return(_database.ListLeftPop(redisKey));
 }