예제 #1
0
        public ActionResult Login(LoginModel u, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    using (_db)
                    {
                        //prueba
                        //revisamos si tiene una pass generica para enviarlo a cambio de contraseña


                        if (_validacion.ValidaAsociados(u.UserName.ToUpper(), u.Password))
                        {
                            _counter = 0;
                            return(RedirectToAction("ResetContraseña", "Account", new { rt = u.UserName.ToUpper() }));
                        }

                        //si no
                        //encriptamos la contraseña en sha1
                        var encriptado = _sha.GetSha1(u.Password);

                        //validamos x usuario y contraseña encriptada
                        if (_validacion.ValidaAsociados(u.UserName.ToUpper(), encriptado))
                        {
                            //revisamos que la cuenta no este bloqueada
                            var sesion = _validacion.Sesion(u.UserName.ToUpper());

                            //si no esta bloqueada accesa
                            if (sesion == false)
                            {
                                var v = _validacion.Validacion(u.UserName.ToUpper(), encriptado);
                                Session.Add("UserID", v.id.ToString());
                                Session.Add("UserFullName", v.IdEmpleado);
                                FormsAuthentication.SetAuthCookie(u.UserName.ToUpper(), false);
                                if (!string.IsNullOrEmpty(returnUrl))
                                {
                                    //si entra a la sesion reiniciamos contador
                                    _counter = 0;
                                    return(Redirect(returnUrl));
                                }
                                _counter = 0;
                                return(RedirectToAction("Index", "Home"));
                            }

                            //si esta bloqueada regresamos a la vista y mandamos mensaje de notificacion
                            else
                            {
                                ViewBag.Error = _mensajes.CuentBloqueada(_counter);
                            }
                        }
                        //validacion mensaje
                        ViewBag.Error = _mensajes.AlertaContraseña();


                        ///////////
                        /// Intentos restantes
                        ///

                        var bloqueado = _validacion.Sesion(u.UserName.ToUpper());
                        if (bloqueado == false)
                        {
                            //revisamos si existe el usuario para los intentos restantes antes de bloquear usuario

                            if (_validacion.ValidaUsuario(u.UserName.ToUpper()))
                            {
                                //tiliza el bloqueo de exclusión mutua de un objeto e iniciamos contador
                                lock (LockObj)
                                {
                                    _counter++;
                                }

                                //si los intentos llegan al limite mandamos bandera para bloquear cuenta
                                if (_counter == 3)
                                {
                                    _validacion.UpdateRegistro(u.UserName.ToUpper());
                                    ViewBag.Error = _mensajes.CuentBloqueada(_counter);
                                }
                                else
                                {
                                    ViewBag.Error = null;
                                    ViewBag.Info  = _mensajes.CredencialesInvalidas(_counter);
                                }
                            }
                        }
                        else
                        {
                            ViewBag.Error = _mensajes.CuentBloqueada(_counter);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    ViewBag.Error = ex.ToString();
                }
            }

            ModelState.Clear();

            return(View());
        }