Exemple #1
0
        /// <summary>
        /// Método utilizado para verificar que el usuario de la aplicación
        /// tiene permiso sobre la acción que intente ejecutar, y si dicho
        /// rol no tiene permiso es redireccionado a una página que le muestra
        /// al usuario un error indicando que no tiene permisos.
        /// </summary>
        /// <param name="filterContext">
        /// Encapsula la información usasa para el mecanismo de autorización.
        /// </param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            db = new SIGECContext();
            var  descriptor = filterContext.ActionDescriptor;
            bool isAView    = descriptor.GetCustomAttributes(typeof(IsViewAttribute), true).Count() > 0;

            if (!isAView)
            {
                return;
            }
            if (filterContext.ActionDescriptor.ActionName.ToLower() == "login")
            {
                return;
            }

            if (WebSecurity.IsAuthenticated) // si el usuario inició sesion
            {
                var a = db.Actions
                        .FirstOrDefault(ac => ac.name == descriptor.ActionName);

                //si el usuario tiene permisos.
                if (new MenuAuthorize().HasPermission(descriptor.ActionName, descriptor.ControllerDescriptor.ControllerName))
                {
                    return;
                }
                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary
                {
                    { "controller", "Unauthorize" },
                    { "action", "ErrorUnauthorized" }
                });
            }
            else // si el usuario no ha iniciado sesión.
            {
                bool isAllowAnonymous = descriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Count() > 0;
                if (isAllowAnonymous)
                {
                    return;
                }

                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary
                {
                    { "controller", "Account" },
                    { "action", "Login" }
                });
            }
        }
Exemple #2
0
        public static bool CheckUser(int userID, string username, string password)
        {
            var valid = false;

            using (SIGECContext db = new SIGECContext())
            {
                var user = db.Users.Find(userID);
                if (user == null)
                {
                    return(false);
                }
                var passwordHelper = new PasswordHelper();
                valid = passwordHelper.ComparePassword(password, user.password, user.salt);
            }

            return(valid);
        }
Exemple #3
0
        /// <summary>
        /// Constructor para sacar los permisos que tiene un usuario y almacenarlos en la variable Menu
        /// </summary>
        public MenuAuthorize()
        {
            try
            {
                if (WebSecurity.IsAuthenticated)
                {
                    db = new SIGECContext();
                    var user = db.Users.FirstOrDefault(usr => usr.ID == WebSecurity.CurrentUserId);

                    foreach (webpages_Roles role in user.webpages_Roles)
                    {
                        foreach (SIGEC.Models.Action action in role.Actions)
                        {
                            if (!Menu.ContainsKey(
                                    string.Format("{0}-{1}", action.Menu.name.Replace("Controller", ""),
                                                  action.name)
                                    ))
                            {
                                Menu.Add(
                                    string.Format("{0}-{1}", action.Menu.name.Replace("Controller", ""), action.name),
                                    action.name
                                    );
                            }
                        }
                    }
                }
            }
            catch
            {
                new AuthorizationContext().Result = new RedirectToRouteResult(
                    new RouteValueDictionary
                {
                    { "controller", "Account" },
                    { "action", "Login" }
                });
            }
        }
        /// <summary>
        /// Metodo utilizado para inicializar la configuración del
        /// plugin WebSecurity, y la inicialización de la conexión
        /// de la base de datos, tomando en cuenta la tabla de la
        /// base de datos que almacenará los datos de los usuarios
        /// de la aplicación. También en este método se insertan los
        /// datos por defecto requeridos para el mínimo funcionamiento
        /// de la aplicación, tales como roles y un usuario por defecto.
        /// </summary>
        public static void RegisterWebSec()
        {
            ///inizializar el websecurity, especificando la tabla
            ///que guardará los datos básicos de usuario.
            WebSecurity.InitializeDatabaseConnection
            (
                "SIGECContext",
                "Users",
                "ID",
                "username",
                autoCreateTables: true
            );

            ///creación de la cuenta por defecto de administrador.
            if (!WebSecurity.UserExists("admin"))
            {
                using (SIGECContext db = new SIGECContext())
                {
                    Address a = new Address();
                    a.city         = "Ciudad";
                    a.municipality = "Municipio";
                    a.sector       = "Sector";
                    a.street       = "Calle";
                    a.number       = "Numero";
                    a.country      = "Republica Dominicana";
                    var passwordHelper = new PasswordHelper();
                    passwordHelper.HashPassword("123456");
                    db.Addresses.Add(a);
                    var user = new User();
                    user.username      = "******";
                    user.password      = PWDTK.HashBytesToHexString(passwordHelper.Hash);
                    user.salt          = PWDTK.HashBytesToHexString(passwordHelper.Salt);
                    user.bornDate      = DateTime.Now;
                    user.createDate    = DateTime.Now;
                    user.email         = "*****@*****.**";
                    user.status        = true;
                    user.gender        = "M";
                    user.maritalStatus = "S";
                    user.dni           = "00000000000";
                    user.firstName     = "admin";
                    user.lastName      = "istrador";
                    user.occupation    = "Super Admin";
                    db.Users.Add(user);
                    user.Address = a;

                    db.SaveChanges();
                }
            }

            var roles = (SimpleRoleProvider)Roles.Provider;

            if (!roles.RoleExists("Admin"))
            {
                roles.CreateRole("Admin");
            }

            if (!roles.GetRolesForUser("admin").Contains("Admin"))
            {
                roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admin" });
            }

            ///insertar datos de menús y acciones en la base de datos
            ///para el manejo de permisos.
            //GlobalHelpers.InsertMenusAndActions();

            ///asignar permisos sobre todas las acciones al rol Admin
            using (var db = new SIGECContext())
            {
                var adminRole = db.webpages_Roles.FirstOrDefault(r => r.RoleName == "Admin");
                foreach (SIGEC.Models.Action a in db.Actions)
                {
                    if (!adminRole.Actions.Contains(a))
                    {
                        adminRole.Actions.Add(a);
                    }
                }
                db.Entry(adminRole).State = System.Data.EntityState.Modified;
                db.SaveChanges();
            }
        }
Exemple #5
0
        /// <summary>
        /// Metodo utilizado para almacenar los nombres de los controladores
        /// y sus acciones asociadas en la base de datos.
        /// </summary>
        public static void InsertMenusAndActions()
        {
            MenuActionProvider cp = new MenuActionProvider();
            bool insertNew        = false;

            using (SIGECContext db = new SIGECContext())
            {
                foreach (string controllerName in cp.GetControllerNames())
                {
                    Menu m = db.Menus.FirstOrDefault(t => t.name == controllerName);

                    if (m == null)
                    {
                        insertNew = true;
                        m         = new Menu();
                        m.name    = controllerName;
                    }

                    List <SIGEC.Models.Action> actions = new List <SIGEC.Models.Action>();


                    string[] lstActions = cp.GetActionNames(controllerName).Distinct().ToArray();
                    foreach (string action in lstActions)
                    {
                        SIGEC.Models.Action a = new SIGEC.Models.Action();
                        a.name = action;
                        actions.Add(a);
                    }
                    if (insertNew)
                    {
                        m.Actions = actions;
                    }
                    else
                    {
                        foreach (SIGEC.Models.Action a in actions)
                        {
                            if (!m.Actions.Contains(a, new Compare <SIGEC.Models.Action>((r, l) => r.name == l.name)))
                            {
                                m.Actions.Add(a);
                            }
                        }
                    }
                    if (db.Menus.FirstOrDefault(con => con.name == controllerName) == null)
                    {
                        db.Menus.Add(m);
                    }
                    try
                    {
                        if (insertNew)
                        {
                            db.SaveChanges();
                        }
                        else
                        {
                            db.Entry(m).State = System.Data.EntityState.Modified;
                            db.SaveChanges();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.Error.WriteLine(ex.InnerException.ToString());
                    }
                    insertNew = false;
                }
            }
        }