Calan,
You may want to take a look at this thread where I had a similar issue: http://ellislab.com/forums/viewthread/199884/
The fix for me was to disable part of a SQL query in the core Session.php file. It’s a very small and easy to make change. Unfortunately, the “require_ip_*” options you can set in the config file do not disable this option, so your sessions will still be invalidated if the user’s IP address is changing.
Verifying that this will solve your issue is a bit more challenging, depending on how familiar with PHP you are. You should make a backup of all of your site files and DB (and know how to restore it) before proceeding. You may also want to notify your editors that the CP may go down briefly while you are working on this (although it is very unlikely).
First SSH into your server and create a new log directory and make it writable:
$ mkdir ~/eelog
$ touch ~/eelog/cp.log
$ chmod -R 777 ~/eelog
Now we need to get the path to the log file.
$ cd ~/eelog
$ pwd
/home/USER/eelog
Whatever value you get from pwd, place into the first ini_set() in the following lines at the top of fetch_session_data() in the file system/expressionengine/libraries/Session.php:
public function fetch_session_data()
{
// debug logging to determine if IP address is changing for users
ini_set("error_log","/home/USER/eelog/cp.log");
ini_set("log_errors",1);
error_log("ip_address = [[".$this->sdata[‘member_id’]." : ".$this->sdata[‘ip_address’]."]]";
Now watch the log file, this will print any new text added to the file instantly to your console output. Press Ctrl+C to kill the watch command after you are done.
$ watch -f ~/eelog/cp.log
Test the setup with your own account and you should see your member_id and IP address listed in the log. After you’re sure that it’s all working, ask the users to continue their work and see if their IP address changes. You’ll need to know each user’s member_id in order to tell who’s IP address you’re seeing.
If the value printed out for ip_address in the log file changes for the same user, you probably need to comment out the ip_address in the same function. Modify the code so that it looks like this:
public function fetch_session_data()
{
// Look for session. Match the user's IP address and browser for added security.
$this->EE->db->select('member_id, admin_sess, last_activity')
->where('session_id', (string) $this->sdata['session_id'])
// disable ip_address check
// ->where('ip_address', $this->sdata['ip_address'])
->where('user_agent', $this->sdata['user_agent']);
After running this I recommend removing the two init_set() and error_log() calls and deleting the eelog directory: