//[EnableCors(origins: "*", headers: "*", methods: "*")] public IHttpActionResult Post() { string usuario = String.Empty, clave = String.Empty; //error por defecto (credenciales incorrectas) (pesimista) //OWASP Secure Coding Best Practices (SBP) (#28, #33) /* 33. Authentication failure responses should not indicate which part of the authentication data was incorrect. * For example, instead of "Invalid username" or "Invalid password", just use "Invalid username and/or password" for both. * Error responses must be truly identical in both display and source code * https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_Checklist */ IHttpActionResult res = Ok(-1); //error generico por defecto (pesimista) // @ la casa bool NoSegTec = true; if (NoSegTec) { //modo desarrollo, brincarse la seguridad del TEC, usar datos alambrados //poner los datos en un oRespuesta<string> para continuar CxC.Objetos.Clases.oRespuesta <string> objResValidar = new oRespuesta <string>(); //CxC.WebApi.WCF_Seguridad.TEC_Usuario datosUsuario = (CxC.WebApi.WCF_Seguridad.TEC_Usuario)resValidar.Data; //falta calcular nombreCompleto, JWToken para retornarlo de una vez DatosUsuario datosUsuarioExt = new DatosUsuario(); datosUsuarioExt.Apellido1 = "Apellido1"; datosUsuarioExt.Apellido2 = "Apellido2"; datosUsuarioExt.Bloqueado = false; datosUsuarioExt.CorreoElectronicoANotificar = "*****@*****.**"; datosUsuarioExt.CorreoElectronicoPrincipal = "*****@*****.**"; datosUsuarioExt.Departamento = "DATIC"; datosUsuarioExt.Descripcion = ""; datosUsuarioExt.DescripPuesto = "Profesional en TI"; datosUsuarioExt.Estado = true; datosUsuarioExt.extension = "2354"; datosUsuarioExt.FechaCreacion = new DateTime(1996, 2, 7); datosUsuarioExt.FechaExpiracion = new DateTime(6155, 12, 31); datosUsuarioExt.FechaNacimiento = new DateTime(1976, 4, 20); datosUsuarioExt.IdDepartamento = 1; datosUsuarioExt.Identificacion = "109360326"; datosUsuarioExt.IdTipoUsuario = 1; datosUsuarioExt.IdUsuario = 1; datosUsuarioExt.NoCarnet = ""; datosUsuarioExt.Nombre = "Nombre"; datosUsuarioExt.OcupaCambioContrasena = false; datosUsuarioExt.Oficina = "B6"; datosUsuarioExt.TipoUsuario = "1"; datosUsuarioExt.UsuarioCreacion = "1"; datosUsuarioExt.UsuarioModificacion = "1"; datosUsuarioExt.UsuarioVencido = false; datosUsuarioExt.NombreCompleto = datosUsuarioExt.Apellido1 + " " + datosUsuarioExt.Apellido2 + " " + datosUsuarioExt.Nombre; datosUsuarioExt.Id = datosUsuarioExt.IdUsuario; datosUsuarioExt.LoginUsuario = usuario; //genera el JW Token y le pone expiración por defecto de 1 hora (esto es renovable) datosUsuarioExt.JWToken = JwtManager.GenerarToken(usuario); datosUsuarioExt.ExpiracionToken = DateTime.UtcNow.AddHours(24); //ya validó al usuario, obtiene los permisos (claims) //aca es donde ocupo obtener los permisos, luego de saber que las credenciales son válidas //TODO var consultaPermisos = ServiciosSeguridad.ConsultarPermisosUsuario(0, datosUsuario.IdUsuario, 0, 0, idUsuarioLogueado, usuarioLogueado, Utilitarios.Clases.Utilitarios.GetIpAddress(), "SessionId"); var datosPermisos = new { };// consultaPermisos.ObjetoRespuesta; var datosCompletos = new { datosUsuario = datosUsuarioExt, datosPermisos = datosPermisos }; //validación correcta del usuario y pone los datos para set retornados los datos objResValidar.CodigoRespuesta = 0; objResValidar.MensajeRespuesta = ""; objResValidar.ObjetoRespuesta = new JavaScriptSerializer().Serialize(datosCompletos); res = Ok(objResValidar); } else { try { if (Request.Headers.Contains("usuario")) { usuario = Request.Headers.GetValues("usuario").FirstOrDefault(); if (Request.Headers.Contains("clave")) { clave = Request.Headers.GetValues("clave").FirstOrDefault(); } var resValidar = ValidarUsuario(usuario, clave); //poner los datos en un oRespuesta<string> para continuar CxC.Objetos.Clases.oRespuesta <string> objResValidar = new oRespuesta <string>(); if (resValidar.Data.GetType().FullName == "CxC.WebApi.WCF_Seguridad.TEC_Usuario") { CxC.WebApi.WCF_Seguridad.TEC_Usuario datosUsuario = (CxC.WebApi.WCF_Seguridad.TEC_Usuario)resValidar.Data; //falta calcular nombreCompleto, JWToken para retornarlo de una vez DatosUsuario datosUsuarioExt = new DatosUsuario(); datosUsuarioExt.Apellido1 = datosUsuario.Apellido1; datosUsuarioExt.Apellido2 = datosUsuario.Apellido2; datosUsuarioExt.Bloqueado = datosUsuario.Bloqueado; datosUsuarioExt.CorreoElectronicoANotificar = datosUsuario.CorreoElectronicoANotificar; datosUsuarioExt.CorreoElectronicoPrincipal = datosUsuario.CorreoElectronicoPrincipal; datosUsuarioExt.Departamento = datosUsuario.Departamento; datosUsuarioExt.Descripcion = datosUsuario.Descripcion; datosUsuarioExt.DescripPuesto = datosUsuario.DescripPuesto; datosUsuarioExt.Estado = datosUsuario.Estado; datosUsuarioExt.extension = datosUsuario.extension; datosUsuarioExt.FechaCreacion = datosUsuario.FechaCreacion; datosUsuarioExt.FechaExpiracion = datosUsuario.FechaExpiracion; datosUsuarioExt.FechaNacimiento = datosUsuario.FechaNacimiento; datosUsuarioExt.IdDepartamento = datosUsuario.IdDepartamento; datosUsuarioExt.Identificacion = datosUsuario.Identificacion; datosUsuarioExt.IdTipoUsuario = datosUsuario.IdTipoUsuario; datosUsuarioExt.IdUsuario = datosUsuario.IdUsuario; datosUsuarioExt.NoCarnet = datosUsuario.NoCarnet; datosUsuarioExt.Nombre = datosUsuario.Nombre; datosUsuarioExt.OcupaCambioContrasena = datosUsuario.OcupaCambioContrasena; datosUsuarioExt.Oficina = datosUsuario.Oficina; datosUsuarioExt.TipoUsuario = datosUsuario.TipoUsuario; datosUsuarioExt.UsuarioCreacion = datosUsuario.UsuarioCreacion; datosUsuarioExt.UsuarioModificacion = datosUsuario.UsuarioModificacion; datosUsuarioExt.UsuarioVencido = datosUsuario.UsuarioVencido; datosUsuarioExt.NombreCompleto = datosUsuario.Apellido1 + " " + datosUsuario.Apellido2 + " " + datosUsuario.Nombre; datosUsuarioExt.Id = datosUsuario.IdUsuario; datosUsuarioExt.LoginUsuario = usuario; //genera el JW Token y le pone expiración por defecto de 1 hora (esto es renovable) datosUsuarioExt.JWToken = JwtManager.GenerarToken(usuario); datosUsuarioExt.ExpiracionToken = DateTime.UtcNow.AddHours(1); //ya validó al usuario, obtiene los permisos (claims) //aca es donde ocupo obtener los permisos, luego de saber que las credenciales son válidas var consultaPermisos = ServiciosSeguridad.ConsultarPermisosUsuario(0, datosUsuario.IdUsuario, 0, 0, idUsuarioLogueado, usuarioLogueado, Utilitarios.Clases.Utilitarios.GetIpAddress(), "SessionId"); var datosPermisos = consultaPermisos.ObjetoRespuesta; var datosCompletos = new { datosUsuario = datosUsuarioExt, datosPermisos = datosPermisos }; //validación correcta del usuario y pone los datos para set retornados los datos objResValidar.CodigoRespuesta = 0; objResValidar.MensajeRespuesta = ""; objResValidar.ObjetoRespuesta = new JavaScriptSerializer().Serialize(datosCompletos); res = Ok(objResValidar); } else { objResValidar.CodigoRespuesta = -1; objResValidar.MensajeRespuesta = "Credenciales inválidas"; } //fin poner datos... } else { //no viene el parametro usuario en el header res = Ok(-2); //SBP#33 - faltan credenciales pero genera credenciales incorrectas } } catch (Exception ex) { res = Ok(-1); //error genérico } } //else del if (NoSecTec) return(res); }