/// <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()); } }
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)); }