public JsonResult Unlock(string passwd) { // IP адрес пользователя string IP = HttpContext.Connection.RemoteIpAddress.ToString(); // Проверяем пароль if (SHA256.Text(passwd) == PasswdTo.Root) { // Записываем в журнал JurnalAdd(IP, "Успешная авторизация"); // Сессия string authSession = md5.text(DateTime.Now.ToBinary().ToString() + PasswdTo.salt); // Создаем сессию в базе coreDB.Auth_Sessions.Add(new AuthSession() { IP = IP, Session = authSession, HashPasswdToRoot = SHA256.Text(SHA256.Text(passwd) + PasswdTo.salt), Expires = DateTime.Now.AddDays(10) }); coreDB.SaveChanges(); // Ставим куки HttpContext.Response.Cookies.Append("authSession", authSession); // Удаляем список неудачных попыток LimitLogin.SuccessAuthorization(IP); // Trigger.OnUnlock((IP, IsSuccess: true)); // Отдаем результат return(Json(new Models.Response.TrueOrFalse(true))); } // Записываем в журнал JurnalAdd(IP, "Неудачная попытка авторизации"); // Записываем в базу IP адрес пользователя, который ввел неправильно пароль LimitLogin.FailAuthorization(IP, TypeBlockIP.global); // Trigger.OnUnlock((IP, IsSuccess: false)); // Отдаем результат return(Json(new Models.Response.Text("Неверный пароль"))); }
public JsonResult Index(string password, string host, string method, string uri, string referer, string hash) { // Декодируем uri, referer и FormData uri = WebUtility.UrlDecode(uri); referer = WebUtility.UrlDecode(referer); #region Проверка переданых параметров if (string.IsNullOrWhiteSpace(password)) { return(Json(new Models.Response.Text("Введите пароль"))); } if (SHA256.Text($"{host}:{method}:{uri}:{referer}:{PasswdTo.salt}") != hash) { return(Json(new Models.Response.Text("Хеш сумма не совпадает"))); } #endregion // User-Agent string userAgent = string.Empty; if (HttpContext.Request.Headers.TryGetValue("User-Agent", out var tmp_userAgent)) { userAgent = tmp_userAgent.ToString(); } // Переменные string IP = HttpContext.Connection.RemoteIpAddress.ToString(); // IP адрес пользователя string HostConvert = Regex.Replace(host.ToLower().Trim(), "^www\\.", ""); // Спецальный host TypeBlockIP typeBlockIP = TypeBlockIP.global; // Блокировка IP в 'Брандмауэр' глобально или только для домена var memoryCache = Service.Get <IMemoryCache>(); // Кеш IMemoryCache #region ModelCache.Domain ModelCache.Domain domain = new ModelCache.Domain(); int DomainID = ISPCache.DomainToID(HostConvert); if (DomainID != 0) { // Достаем данные для домена из кеша domain = ISPCache.GetDomain(DomainID); typeBlockIP = domain.typeBlockIP; } #endregion #region Проверяем IP в блокировке IPtables по домену if (IPtables.CheckIP(IP, out ModelIPtables BlockedData, HostConvert)) { // Логируем пользователя AddJurnalToIPtables(domain, IP, host, method, userAgent, referer, uri); CheckRequest.SetCountRequestToHour(TypeRequest._200, host, domain.confToLog.EnableCountRequest); // Отдаем ответ return(Json(new Models.Response.Text(BlockedData.Description))); } #endregion // Проверяем пароль if (SHA256.Text(password) == PasswdTo.FA || (!string.IsNullOrWhiteSpace(domain.Auth2faToPasswd) && SHA256.Text(password) == domain.Auth2faToPasswd)) { // Добавляем информацию о разрешеном доступе, для вывода информации и отмены доступа AccessIP.Add(IP, host, DateTime.Now.AddHours(12), domain.Auth2faToAccess == Auth2faToAccess.FullAccess ? AccessType.all : AccessType.Is2FA); // Добовляем IP в белый список на 12 часа string keyToAccess = domain.Auth2faToAccess == Auth2faToAccess.FullAccess ? KeyToMemoryCache.CheckLinkWhitelistToAll(host, IP) : KeyToMemoryCache.CheckLinkWhitelistTo2FA(host, IP); memoryCache.Set(keyToAccess, (byte)1, TimeSpan.FromHours(12)); // Записываем данные авторизации в журнал AddToJurnal2FA(domain, IP, host, method, uri, referer, "Успешная авторизация"); // Считаем статистику запросов CheckRequest.SetCountRequestToHour(TypeRequest._2fa, host, domain.confToLog.EnableCountRequest); // Удаляем список неудачных попыток LimitLogin.SuccessAuthorization(IP); // Trigger.OnUnlock2FA((IP, userAgent, referer, DomainID, method, HostConvert, uri, password, true)); // Отдаем результат return(Json(new Models.Response.TrueOrFalse(true))); } // Записываем данные авторизации в журнал AddToJurnal2FA(domain, IP, host, method, uri, referer, "Неудачная попытка авторизации"); // Считаем статистику запросов CheckRequest.SetCountRequestToHour(TypeRequest._2fa, host, domain.confToLog.EnableCountRequest); // Записываем в базу IP адрес пользователя, который ввел неправильно пароль LimitLogin.FailAuthorization(IP, typeBlockIP, HostConvert); // Trigger.OnUnlock2FA((IP, userAgent, referer, DomainID, method, HostConvert, uri, password, false)); // Отдаем результат return(Json(new Models.Response.Text("Неверный пароль"))); }
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)); }