Exemple #1
0
        public JsonResult SeleccionarRol(SeleccionarRolViewModel seleccionarRolViewModel)
        {
            var tokenHeader    = seleccionarRolViewModel.Token;
            var claveEncriptar = Base64.Encode(AppSettings.Get <string>(ConstantesWebConfig.CLAVE_ENCRYPTACION));
            var tokenResult    = Token.DecodeToken(claveEncriptar, tokenHeader);

            if (!tokenResult.Validated)
            {
                var mensaje = string.Empty;
                if (tokenResult.Errors[0].Equals(TokenValidationStatus.Expired))
                {
                    mensaje = string.Format("Su sesion ha expirado.");
                }
                else
                {
                    if (tokenResult.Errors[0].Equals(TokenValidationStatus.WrongToken))
                    {
                        mensaje = string.Format("El valor de token es invalido.");
                    }
                }

                var result = StatusResponseHelper.JsonNoAutenticado(mensaje, false);
                return(result);
            }


            if (tokenResult.UserId != 0 && !string.IsNullOrWhiteSpace(seleccionarRolViewModel.RolCodigo))
            {
                //Verificar q la cuenta no este asignada a otro usuario
                Usuario usuario = _repository.Get(tokenResult.UserId);
                if (usuario != null)
                {
                    var result = AutentificarUsuario(usuario, null, seleccionarRolViewModel.RolCodigo);
                    return(result);
                }
            }

            return(StatusResponseHelper.JsonNoAutenticado("El usuario o el Rol seleccionado no esta asociado", false));
        }
Exemple #2
0
        public void OnAuthentication(AuthenticationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("AuthenticationTokenAttribute");
            }


            //1. Saltar autorizacion, si el controlador o la accion tiene el atributo AllowAnonymousAttribute
            bool isAllowAnonymousAttribute =
                filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true);


            if (isAllowAnonymousAttribute)
            {
                return;
            }

            string tokenHeader = filterContext.HttpContext.Request.Headers["token"];

            if (tokenHeader == null || tokenHeader.IsEmpty())
            {
                var error  = string.Format("No Autorizado no se encontro un token.");
                var result = StatusResponseHelper.JsonNoAutenticado(error, false);
                filterContext.Result = result;
                return;
            }

            var claveEncriptar = Base64.Encode(AppSettings.Get <string>(ConstantesWebConfig.CLAVE_ENCRYPTACION));
            var tokenResult    = Token.DecodeToken(claveEncriptar, tokenHeader);

            if (!tokenResult.Validated)
            {
                var mensaje = string.Empty;
                if (tokenResult.Errors[0].Equals(TokenValidationStatus.Expired))
                {
                    mensaje = string.Format("Su sesion ha expirado.");
                }
                else
                {
                    if (tokenResult.Errors[0].Equals(TokenValidationStatus.WrongToken))
                    {
                        mensaje = string.Format("El valor de token es invalido.");
                    }
                }

                var result = StatusResponseHelper.JsonNoAutenticado(mensaje, false);
                filterContext.Result = result;
                return;
            }

            var _application = ServiceLocator.Current.GetInstance <IApplication>();
            var _repository  = ServiceLocator.Current.GetInstance <IUsuarioRepository <Usuario> >();

            Usuario usuario = _repository.Get(tokenResult.UserId);

            //Para indicar que no se ha seleccionado un rol
            if (tokenResult.RolId == -1)
            {
                var _rolesUsuario = usuario.Roles;
                var modelRol      = new SeleccionarRolViewModel();
                foreach (var item in _rolesUsuario)
                {
                    var rolView = new RolViewModel()
                    {
                        CodigoRol = item.Codigo, NombreRol = item.Nombre
                    };
                    modelRol.Roles.Add(rolView);
                }
                var usuarioView = new
                {
                    usuId             = usuario.Id,
                    version           = usuario.VersionRegistro,
                    usuNombres        = usuario.Nombres,
                    usuApellidos      = usuario.Apellidos,
                    usuIdentificacion = usuario.PersonaId,
                    usuDireccion      = "",
                    usuUsuario        = usuario.Cuenta,
                    usuClave          = "",
                    usuCorreo         = usuario.Correo,
                    usuEstado         = usuario.Estado
                };
                var result = StatusResponseHelper.JsonNoSeleccionadoRol("No se ha seleccionado un rol.", modelRol, usuarioView, tokenHeader);
                filterContext.Result = result;
                return;
            }

            var _rolService = ServiceLocator.Current.GetInstance <IRolService>();

            Rol rol = _rolService.Get(tokenResult.RolId);

            var _repositorySesion = ServiceLocator.Current.GetInstance <IRepository <Sesion> >();

            var sesion = _repositorySesion.Get(tokenResult.SesionId);

            if (usuario == null)
            {
                var result = StatusResponseHelper.JsonNoAutenticado("No existe usuario para el valor de token", false);
                filterContext.Result = result;
                return;
            }

            if (rol == null)
            {
                var result = StatusResponseHelper.JsonNoAutenticado("No existe rol para el valor de token", false);
                filterContext.Result = result;
                return;
            }

            if (sesion == null)
            {
                var result = StatusResponseHelper.JsonNoAutenticado("No existe sesion para el valor de token", false);
                filterContext.Result = result;
                return;
            }

            //Establecer objetos de acceso
            _application.SetCurrentUser(usuario);
            _application.SetCurrentRol(rol);
            _application.SetCurrentSession(sesion);

            //TODO: JOR - Generar nuevo token con actualizacion de tiempo de creacion para la expiracion de sesiones
            var minutosExpiracionToken = Convert.ToInt32(AppSettings.Get <string>(ConstantesWebConfig.TOKEN_TIEMPOSESION));
            var token = Token.GenerateToken(claveEncriptar, usuario.Id, rol.Id, tokenResult.SesionId, minutosExpiracionToken);

            //JOR:Token actualizado para nuevas peticiones
            filterContext.HttpContext.Response.AppendHeader("token", token);

            //base.OnActionExecuting(filterContext);
        }
Exemple #3
0
        /// <summary>
        /// Autentificar usuario
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="ipClient"></param>
        /// <param name="codigoRol"></param>
        /// <returns></returns>
        private JsonResult AutentificarUsuario(Usuario usuario, string ipClient, string codigoRol)
        {
            try
            {
                //TODO. JSA. Revisar el flujo si al momento de seleccionar un rol, este es externo, Por lo tanto no lo va tener asociado
                //al usuario.  (Fallas Seguridad)
                //opcion 1. Sincrionizar rol_usuario, (externoas y internos)
                //opcion 2. Pasar informacion en el model de la vista tipo (externo y interno), si es un rol externo pasar si verificacion o
                //recuperar de una sesion los roles externos del usuario

                JsonResult result;

                Rol rol = _rolService.GetList().Where(c => c.Codigo == codigoRol).FirstOrDefault();

                if (rol == null)
                {
                    string error = string.Format("No existe el rol con el codigo {0}", codigoRol);
                    result = StatusResponseHelper.JsonNoAutenticado(error, false);
                    return(result);
                }

                if (!rol.EsExterno)
                {
                    rol = usuario.Roles.Where(c => c.Codigo == codigoRol).SingleOrDefault();

                    if (rol == null)
                    {
                        string error = string.Format("El usuario {0}, no tiene asociado el rol con el codigo {1}", usuario.Cuenta, codigoRol);
                        result = StatusResponseHelper.JsonNoAutenticado(error, false);
                        return(result);
                    }
                }


                //Autentificar usuario
                //Obtener la direccion IP del cliente
                string ipAddress = ipClient;
                if (string.IsNullOrWhiteSpace(ipAddress))
                {
                    ipAddress = RequestHelpers.GetClientIpAddress(this.HttpContext.Request);
                }

                var claveEncriptar         = AppSettings.Get <string>(ConstantesWebConfig.CLAVE_ENCRYPTACION);
                var minutosExpiracionToken = Convert.ToInt32(AppSettings.Get <string>(ConstantesWebConfig.TOKEN_TIEMPOSESION));

                InitializeUserAccessServiciosWeb initializeUserAccessServiciosWeb = new InitializeUserAccessServiciosWeb();

                initializeUserAccessServiciosWeb.usuario   = usuario;
                initializeUserAccessServiciosWeb.rol       = rol;
                initializeUserAccessServiciosWeb.ipAddress = ipAddress;

                _accessService.InitializeUserAccess(initializeUserAccessServiciosWeb);

                var sesion = _application.GetCurrentSession();

                var token = Token.GenerateToken(Base64.Encode(claveEncriptar), usuario.Id, rol.Id, sesion.Id, minutosExpiracionToken);

                //FormsAuthentication.SetAuthCookie(usuario.Cuenta, false);

                var mensaje =
                    string.Format("El usuario {0}, ingresa de forma exitosa al sistema", usuario);
                //Registro Auditoria - Hora de inicio de sesión en el sistema.
                logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);

                //Direccionar a la URL segun la configuración del ROL, o direccionar a URL Default
                //string URL = FormsAuthentication.DefaultUrl;
                //if (!string.IsNullOrWhiteSpace(rol.Url))
                //{
                //    URL = rol.Url;
                //}

                /*var miFarmacia = _iFarmaciaService.GetMisFarmacias().Select(mf => mf.Farmacia).FirstOrDefault();
                 * String fileBase64 = miFarmacia == null || miFarmacia.Logo == null
                 || (!rol.Codigo.Equals(ConstantesRoles.ROL_FARMACEUTICO_PROPIETARIO) && !rol.Codigo.Equals(ConstantesRoles.ROL_FARMACEUTICO2)) ?
                 || null : DataUrl.FromFileTypeAndBytes(miFarmacia.FileTypeLogo, miFarmacia.Logo);*/

                var rolView     = new { codigoRol = rol.Codigo, rolNombre = rol.Nombre, rolEsadministrador = rol.EsAdministrador };
                var usuarioView = new
                {
                    usuId             = usuario.Id,
                    version           = usuario.VersionRegistro,
                    usuNombres        = usuario.Nombres,
                    usuApellidos      = usuario.Apellidos,
                    usuIdentificacion = usuario.PersonaId,
                    usuDireccion      = "",
                    usuUsuario        = usuario.Cuenta,
                    usuClave          = "",
                    usuCorreo         = usuario.Correo,
                    usuEstado         = usuario.Estado,
                    //ImagenPerfil = fileBase64
                };

                result = new JsonResult
                {
                    Data = new
                    {
                        mensaje,
                        rol         = rolView,
                        usuario     = usuarioView,
                        miToken     = token,
                        autenticado = true
                    },
                    //ContentType = contentType,
                    //ContentEncoding = contentEncoding,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                return(result);
            }
            catch (Exception ex)
            {
                var result = ManejadorExcepciones.HandleException(ex);

                //TODO: DEPENDENCIAS DE REINICIAR. MEJOR GUARDAR EN SESSION LA IDENTIDAD
                FormsAuthentication.SignOut();

                Session.Clear();

                var result1 = StatusResponseHelper.JsonErrorServidor(result.Message, true);
                return(result1);
            }
        }
Exemple #4
0
        public JsonResult Ingresar(LoginViewModel model)
        {
            if (model.Usuario != null && !model.Usuario.IsEmpty() && model.Password != null && !model.Password.IsEmpty())
            {
                //1. Autentificacion contra Membership
                var proveedorMembresia = Membership.Provider;

                model.Usuario = model.Usuario.Trim();
                MembershipUser user = Membership.GetUser(model.Usuario);

                if (user == null)
                {
                    Log.DebugFormat("No existe el usuario [{0}]", model.Usuario);
                    var error  = "Usuario ó Clave incorrecta";
                    var result = StatusResponseHelper.JsonNoAutenticado(error, true);
                    return(result);
                }


                if (!user.IsApproved)
                {
                    var error  = string.Format("El usuario [{0}], se encuentra pendiente de activación, revice su correo o contáctese con soporte.", model.Usuario);
                    var result = StatusResponseHelper.JsonNoAutenticado(error, true);
                    return(result);
                }

                //1.1. Usuario Bloqueado
                //if (user.IsLockedOut)
                //{
                //    var mensaje =
                //           string.Format("El usuario " + model.Usuario + ", se encuentra bloqueado");
                //    logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);


                //    ModelState.AddModelError("", string.Format("El usuario [{0}], se encuentra bloqueado", model.Usuario));
                //    return IntentarIngreso(model);
                //}

                //TODO: Personalizar mensajes de AD
                //try
                //{

                //    var server = ConfigurationManager.AppSettings["Udla.CarpetaLinea.Url.ActiveDirectory"];
                //    var entry = new DirectoryEntry(server, model.Usuario, model.Password);
                //    var nativeObject = entry.NativeObject;
                //}
                //catch (DirectoryServicesCOMException cex)
                //{
                //    //TODO: Capturar por codigos de excepciones.
                //    if (cex.ExtendedErrorMessage.Contains("532"))
                //    {
                //        var mensaje =
                //          string.Format("La contraseña del usuario " + model.Usuario + ", se encuentra expirada");
                //        logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);

                //        ModelState.AddModelError("", string.Format("La contraseña del usuario [{0}] está expirada. Por favor utilice la opción 'Cambiar contraseña'", model.Usuario));
                //        ViewBag.ShowLink = false;
                //        return IntentarIngreso(model);
                //    }
                //    else if (cex.ExtendedErrorMessage.Contains("773"))
                //    {
                //        var mensaje =
                //          string.Format("El usuario " + model.Usuario + ", debe cambiar la contraseña");
                //        logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);

                //        ModelState.AddModelError("", string.Format("El usuario [{0}] debe cambiar la contraseña", model.Usuario));
                //        return IntentarIngreso(model);
                //    }
                //    else if (cex.ExtendedErrorMessage.Contains("775"))
                //    {
                //        //TODO JLA: Personalizar mensaje contra tiempo de duracion de bloqueo
                //        var minutes = getLockoutDuration(model.Usuario);
                //        var mensaje =
                //          string.Format("El usuario " + model.Usuario + ", se encuentra bloqueado");

                //        logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);

                //        ModelState.AddModelError("", string.Format("El usuario [{0}] se encuentra bloqueado. Por favor intentarlo en [{1}] minutos", model.Usuario, minutes));
                //        return IntentarIngreso(model);
                //    }
                //}

                var membresia = proveedorMembresia.ValidateUser(model.Usuario, model.Password);
                if (membresia)
                {
                    Usuario usuario = _repository.Get(model.Usuario);
                    if (usuario.PersonaId.HasValue)
                    {
                        var persona = _repositoryPersona.Get((int)usuario.PersonaId);
                        usuario.Nombres        = persona.PrimerNombre + " " + persona.SegundoNombre;
                        usuario.Apellidos      = persona.PrimerApellido + " " + persona.SegundoApellido;
                        usuario.Identificacion = persona.Identificacion;
                        usuario.Correo         = persona.Correo;
                    }
                    else
                    {
                        usuario.Nombres        = "Anonimo";
                        usuario.Apellidos      = string.Empty;
                        usuario.Identificacion = string.Empty;
                        usuario.Correo         = string.Empty;
                    }

                    if (usuario == null)
                    {
                        //var sincronizar_usuario_externo = _parametroService.GetValor<bool>(CodigosParametros.PARAMETRO_SEGURIDAD_SINCRONIZAR_USUARIOS_EXTERNOS);

                        //if (sincronizar_usuario_externo)
                        //{
                        //    usuario = SincronizarUsuarioExterno(model.Usuario, infoExternal, rolesInternosExternos);
                        //}
                        //else
                        //{

                        var error  = string.Format("No existe el usuario [{0}]", model.Usuario);
                        var result = StatusResponseHelper.JsonNoAutenticado(error, false);
                        return(result);
                        //}
                    }

                    var modelRol = new SeleccionarRolViewModel();
                    modelRol.UsuarioId     = usuario.Id;
                    modelRol.NombreUsuario = usuario.ToString();
                    modelRol.IPClient      = model.IPClient;

                    //Unir Roles asociados al usuario
                    var _rolesUsuario = usuario.Roles;
                    foreach (var item in _rolesUsuario)
                    {
                        var rolView = new RolViewModel()
                        {
                            CodigoRol = item.Codigo, NombreRol = item.Nombre
                        };
                        modelRol.Roles.Add(rolView);
                    }


                    if (modelRol.Roles.Count == 1)
                    {
                        var mensaje =
                            string.Format("El usuario {0}, ingresa por defecto con el codigo de rol {1}", usuario, modelRol.Roles.FirstOrDefault().NombreRol);

                        //Registro Auditoria - Hora de inicio de sesión en el sistema.
                        logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);
                        //Si unicamente existe un rol autentificar
                        return(AutentificarUsuario(usuario, null, modelRol.Roles.FirstOrDefault().CodigoRol));
                    }
                    else if (modelRol.Roles.Count > 1)
                    {
                        modelRol.Roles = modelRol.Roles.OrderBy(c => c.NombreRol).ToList();
                        var usuarioView = new
                        {
                            usuId             = usuario.Id,
                            version           = usuario.VersionRegistro,
                            usuNombres        = usuario.Nombres,
                            usuApellidos      = usuario.Apellidos,
                            usuIdentificacion = usuario.PersonaId,
                            usuDireccion      = "",
                            usuUsuario        = usuario.Cuenta,
                            usuClave          = "",
                            usuCorreo         = usuario.Correo,
                            usuEstado         = usuario.Estado
                        };

                        var claveEncriptar         = AppSettings.Get <string>(ConstantesWebConfig.CLAVE_ENCRYPTACION);
                        var minutosExpiracionToken = Convert.ToInt32(AppSettings.Get <string>(ConstantesWebConfig.TOKEN_TIEMPOSESION));
                        //Se fija -1 al rol y sesion actual mientras el usuario elije un rol
                        var token = Token.GenerateToken(Base64.Encode(claveEncriptar), usuario.Id, -1, -1, minutosExpiracionToken);

                        var roles = (from x in modelRol.Roles
                                     let label = x.NombreRol
                                                 let value = x.CodigoRol
                                                             orderby x.NombreRol
                                                             select new { label, value });

                        var result = new JsonResult
                        {
                            Data = new
                            {
                                roles,
                                usuario     = usuarioView,
                                miToken     = token,
                                autenticado = true
                            },
                            //ContentType = contentType,
                            //ContentEncoding = contentEncoding,
                            JsonRequestBehavior = JsonRequestBehavior.AllowGet
                        };
                        return(result);
                    }
                    else if (modelRol.Roles.Count == 0)
                    {
                        string error   = string.Format("Usuario {0}, no posee roles establecidos para ingresar al sistema", model.Usuario);
                        var    mensaje =
                            string.Format("El usuario {0}, no posee roles establecidos para ingresar al sistema", usuario);

                        //Registro Auditoria - Hora de inicio de sesión en el sistema.
                        logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);
                        var result = StatusResponseHelper.JsonNoAutenticado(error, true);
                        return(result);
                    }
                }
                else
                {
                    var mensaje =
                        string.Format("El usuario {0}, ha intentado realizar Loguin en el sistema, usuario no autenticado", model.Usuario);
                    //Registro Auditoria - Hora de intento de logueo en la aplicación.
                    logAuditoria.Write(FUNCIONALIDAD_GESTION_USUARIOS.ACCION_LOGIN, mensaje);

                    var result = StatusResponseHelper.JsonNoAutenticado("Usuario o contraseña incorrecto", true);
                    return(result);
                }
            }

            var result1 = StatusResponseHelper.JsonNoAutenticado("Usuario o contraseña incorrecto", true);

            return(result1);
        }