public async Task <bool> Authorize(Accion action)
        {
            Guard.AgainstArgumentNull(action, "action");



            //1. Obtener usuario actual
            var usuario = _application.GetCurrentUser();

            if (usuario == null)
            {
                return(false);
            }

            log.DebugFormat("Verificar permiso de la accion {0} en la funcionalidad {1} para el usuario [{2}-{3}]", action.Codigo, action.FuncionalidadId,
                            usuario.Cuenta, usuario.Nombres);


            //Verificar si la accion se encuentra en las funcionalidades del modulo autentificado
            var modulo = _application.GetCurrentModule();
            var verificarAccionModuloAutentificado =
                (await ModuloService.GetModuleAndFunctionality(modulo.Id)).Funcionalidades.Any(f => f.Id == action.FuncionalidadId);

            if (!verificarAccionModuloAutentificado)
            {
                log.DebugFormat("La accion {0}, no se encuentra en las funcionalidades del modulo autentificado {1}", action.Codigo, modulo.Codigo);
                return(false);
            }


            if (usuario.Roles.Where(r => r.EsAdministrador).Any())
            {
                log.DebugFormat("El usuario {0}, posee un rol que es administrador", usuario.Cuenta);
                return(true);
            }

            //1. Obtener listado de Roles/Permisos asociadas al usuario autentificado
            var roles = (await RolService.GetAllRolAndPermissions())
                        .Where(r => usuario.Roles.Any(rUser => rUser.Id == r.Id)).ToList();


            //2. Recuperar Permisos que posee el rol Autentificado
            var permisos = (from r in roles
                            where r.Permisos.Any(p => p.AccionId == action.Id)
                            select r.Permisos).ToList();


            if (permisos.Any())
            {
                return(true);
            }

            return(false);
        }