Eu vim com uma nova solução, que tem um pouco de sobrecarga, mas parece estar funcionando até agora como um protótipo. Uma suposição é que você esteja em um ambiente de sistema de honra para efetuar login, embora isso possa ser adaptado solicitando novamente uma senha sempre que você alternar as guias.
Use localStorage (ou equivalente) e o evento de armazenamento HTML5 para detectar quando uma nova guia do navegador mudou qual usuário está ativo. Quando isso acontecer, crie uma sobreposição fantasma com uma mensagem dizendo que você não pode usar a janela atual (ou desativar a janela temporariamente, talvez não seja tão visível assim.) Quando a janela recuperar o foco, envie um registro de solicitação AJAX o usuário de volta.
Uma ressalva a esta abordagem: você não pode ter chamadas AJAX normais (isto é, aquelas que dependem da sua sessão) acontecem em uma janela que não tem o foco (por exemplo, se você recebeu uma chamada após um atraso), a menos que você faz manualmente uma chamada de re-login do AJAX antes disso. Então, na verdade, tudo o que você precisa é fazer com que sua função AJAX verifique primeiro para garantir que localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id e, se não, faça login primeiro através do AJAX.
Outra são as condições de corrida: se você pode alternar entre janelas rápido o suficiente para confundi-las, pode acabar com uma sequência relogin1-> relogin2-> ajax1-> ajax2, com o ajax1 sendo feito na sessão errada. Para contornar isso, envie solicitações AJAX de login para uma matriz e, em seguida, armazene e antes de emitir uma nova solicitação de login, aborte todas as solicitações atuais.
A última dica a ser observada é a atualização de janelas. Se alguém atualizar a janela enquanto você tiver uma solicitação de login AJAX ativa, mas não concluída, ela será atualizada no nome da pessoa errada. Nesse caso, você pode usar o evento beforeunload fora do padrão para avisar o usuário sobre a possível confusão e solicitar que ele clique em Cancelar, enquanto reemite uma solicitação de login do AJAX. Então, a única maneira de fazer isso é clicando em OK antes da conclusão da solicitação (ou pressionando acidentalmente a tecla Enter / barra de espaço, porque OK é - infelizmente para este caso - o padrão). Existem outras maneiras de lidar com esse caso, como detectar as teclas F5 e Ctrl + R / Alt + R, que funcionam na maioria dos casos, mas podem ser frustradas pela reconfiguração de atalhos de teclado do usuário ou uso alternativo do SO. No entanto, este é um caso de ponta na realidade, e os piores cenários nunca são tão ruins: em uma configuração do sistema de honra, você seria logado como a pessoa errada (mas você pode deixar óbvio que esse é o caso personalizando páginas com cores, estilos, nomes exibidos de forma destacada, etc.); em uma configuração de senha, o ônus recai sobre a última pessoa que digitou sua senha para ter desconectado ou compartilhado sua sessão ou, se essa pessoa é realmente o usuário atual, não há violação.
Mas, no final, você tem um aplicativo de um usuário por guia que (espero) apenas age como deveria, sem ter que necessariamente configurar perfis, usar o IE ou reescrever URLs. Certifique-se de tornar óbvio em cada guia que está logado nessa guia específica, embora ...