/// <summary> /// Obtiene los datos de la ciudad de una ip /// </summary> /// <param name="ip">Ip de donde se conectan</param> /// <returns></returns> public async Task <DatosIPDTO> ObtenerDatosPorIpAsync(string ip) { HttpClient client = new HttpClient(); DatosIPDTO datosIP = new DatosIPDTO(); var respuesta = await client.GetStringAsync($"{apiUrl}/?apiKey={apiKey}&ip={ip}&fields=geo,continent_name,organization"); var datosGeo = JsonSerializer.Deserialize <IPGeoLocationDTO>(respuesta); datosIP.city = datosGeo.City; datosIP.country = datosGeo.CountryName; datosIP.continent = datosGeo.ContinentName; datosIP.country_code = datosGeo.CountryCode2; datosIP.latitude = datosGeo.Latitude; datosIP.longitude = datosGeo.Longitude; datosIP.postal_code = datosGeo.Zipcode; datosIP.subdivision = datosGeo.StateProv; datosIP.subdivision2 = datosGeo.District; datosIP.org = datosGeo.Organization; return(datosIP); }
/// <summary> /// Revisa si la ip del usuario pertenece a una ciudad diferente /// al historial de ciudades de donde se conecta el usuario /// </summary> /// <param name="ip">Ip de la cual se conecta el usuario</param> /// <param name="usuarioId">Id del usuario</param> /// <returns></returns> public async Task <bool> EsOtraCiudadAsync(string ip, int usuarioId) { IPGeoLocation ipGeoLocation = new IPGeoLocation(); //Obtenemos los datos de la ip datosIP = await this.ObtenerDatosIPAsync(ip, ipGeoLocation); //Revisamos si ya registro algún acceso, si no tiene //accesos no se debe enviar ningún correo var acceso = contexto.UsuarioAcceso.FirstOrDefault(u => u.UsuarioId == usuarioId); if (acceso == null) { return(false); } //Revisamos si tiene un registro en otra ciudad acceso = contexto.UsuarioAcceso.FirstOrDefault(u => u.UsuarioId == usuarioId && u.Ciudad != datosIP.city); //Si ya tiene un acceso para esa ciudad regresamos false return(acceso != null); }
/// <summary> /// Guarda los datos del acceso del usuario /// </summary> /// <param name="token">Datos del token</param> /// <param name="usuarioId">Id del usuario</param> /// <param name="ip">Ip de la cual se conecta el usuario</param> /// <param name="navegador">Navegador del cual se conecta el usuario</param> /// <returns></returns> public async Task <bool> GuardarAccesoAsync(TokenDTO token, int usuarioId, string ip, string navegador) { IPGeoLocation ipGeoLocation = new IPGeoLocation(); if (datosIP == null) { datosIP = await ObtenerDatosIPAsync(ip, ipGeoLocation); } var usuarioAcceso = new UsuarioAcceso(); usuarioAcceso.Ciudad = datosIP.city; usuarioAcceso.Estado = datosIP.subdivision; usuarioAcceso.Navegador = navegador; usuarioAcceso.UsuarioId = usuarioId; usuarioAcceso.Fecha = DateTime.Now; usuarioAcceso.Token = token.Token.Split(".")[2]; usuarioAcceso.Activo = true; usuarioAcceso.SistemaOperativo = "Default"; usuarioAcceso.RefreshToken = token.RefreshToken; usuarioAcceso.Navegador = "Default"; contexto.UsuarioAcceso.Add(usuarioAcceso); contexto.SaveChanges(); return(true); }
/// <summary> /// Envia correo cuando se entra al sistema de otra ciudad /// </summary> /// <param name="path">Ruta para los templates</param> /// <param name="usuario">Usuario</param> /// <param name="email">Email</param> /// <param name="datosIP">Datos de la ip</param> /// <param name="ip">Ip</param> /// <param name="navegador">Navegador</param> private void EnviaCorreoNuevoAcceso(string path, string usuario, string email, DatosIPDTO datosIP, string ip, string navegador) { string body = System.IO.File.ReadAllText(Path.Combine(path, "Templates", "NuevoAcceso.html")); body = body.Replace("{{usuario}}", usuario); body = body.Replace("{{ciudad}}", datosIP.city); body = body.Replace("{{estado}}", datosIP.subdivision); body = body.Replace("{{pais}}", datosIP.country); body = body.Replace("{{ip}}", ip); body = body.Replace("{{navegador}}", navegador); body = body.Replace("{{fecha}}", DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString()); Correo mail = new Correo(Configuration) { Para = email, Mensaje = body, Asunto = "Nuevo acceso en " + datosIP.city }; try { mail.Enviar(); } catch (Exception ex) { Console.WriteLine(ex.InnerException); } }