Ejemplo n.º 1
0
        /// <summary>
        /// Выполнить запрос в API
        /// </summary>
        /// <param name="uriPath">/add/requests-filter/aliases</param>
        /// <param name="args">"DomainId=1", "aliases[1].host=test.com"</param>
        public string API(string uriPath, params string[] args)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    // Уникальный ключ
                    string apiKey = Generate.Passwd(24);

                    // Добавляем ключ в память
                    var memoryCache = Service.Get <IMemoryCache>();
                    memoryCache.Set(KeyToMemoryCache.ApiToLocalKey(apiKey), (byte)0, TimeSpan.FromSeconds(90));

                    // Отправляем запрос в API
                    client.DefaultRequestHeaders.Add("ApiKey", apiKey);
                    string arg = args.Length > 0 ? $"?{String.Join('&', args)}" : string.Empty;
                    return(client.GetStringAsync($"http://127.0.0.1:4538/api{uriPath}{arg}").Result);
                }
            }
            catch (Exception ex) { return(ex.ToString()); }
        }
Ejemplo n.º 2
0
        public Task Invoke(HttpContext httpContext)
        {
            if (httpContext.Request.Path.Value != "/api/faq" && httpContext.Request.Path.Value.StartsWith("/api"))
            {
                // IP-адрес пользователя
                string IP = httpContext.Connection.RemoteIpAddress.ToString();

                #region Локальный запрос в API
                if (httpContext.Request.Headers.TryGetValue("ApiKey", out var apiKey) && !string.IsNullOrWhiteSpace(apiKey))
                {
                    var memoryCache = Service.Get <IMemoryCache>();
                    if (memoryCache.TryGetValue(KeyToMemoryCache.ApiToLocalKey(apiKey), out _))
                    {
                        LimitLogin.SuccessAuthorization(IP);
                        return(_next(httpContext));
                    }
                    else
                    {
                        LimitLogin.FailAuthorization(IP, TypeBlockIP.global);
                    }
                }
                #endregion

                // База
                var jsonDB = Service.Get <JsonDB>();

                // Если API выключен
                if (!jsonDB.API.Enabled)
                {
                    return(httpContext.Response.WriteAsync($"API disabled"));
                }

                // Белый IP
                if (jsonDB.API.WhiteIP == IP)
                {
                    return(_next(httpContext));
                }

                // Проверяем авторизацию
                if (httpContext.Request.Headers.TryGetValue("Authorization", out var auth))
                {
                    // Проверка авторизации
                    if (auth.ToString().Replace("Basic ", "") == Convert.ToBase64String(Encoding.ASCII.GetBytes($"{jsonDB.API.Login}:{jsonDB.API.Password}")))
                    {
                        // Авторизован
                        LimitLogin.SuccessAuthorization(IP);
                        return(_next(httpContext));
                    }
                    else
                    {
                        // Пароль или логин не совпадает
                        LimitLogin.FailAuthorization(IP, TypeBlockIP.global);
                        return(httpContext.Response.WriteAsync("Login or password does not match"));
                    }
                }

                // Пользователь не авторизован
                return(httpContext.Response.WriteAsync("Not authorized"));
            }

            return(_next(httpContext));
        }