Я пытаюсь реализовать механизм аутентификации, в котором каждая вкладка браузера может быть зарегистрирована как другой пользователь.
Вот правила этой системы:
- Маркер аутентификации указывает, какой пользователь зарегистрирован.
- Есть два типа токенов аутентификации: частные и общедоступные.
- Каждый закрытый токен привязан к одной вкладке и определяет ее учетную информацию.
- Открытый токен может быть прочитан/записан любой вкладкой и отображен на последней учетной записи, которая была зарегистрирована (на всех вкладках).
- Когда пользователь выходит на любую вкладку, удаляются как личные, так и общедоступные токены.
- Каждый раз, когда вкладка попадает на страницу, требующую аутентификации, система пытается прочитать частный токен. Если он не установлен (как в случае новой/пустой вкладки), он пытается копировать значение общедоступного токена в закрытый токен. Если общедоступный токен не установлен, пользователь перенаправляется на экран проверки подлинности.
- Когда вкладка уже зарегистрирована и пользователь нажимает на ссылку, запрос должен содержать закрытый токен в пользовательском HTTP-заголовке. Отправка этой информации в URI не является вариантом по соображениям безопасности.
- Возможность навигации с помощью кнопки "назад/вперед" так же, как и для обычных ссылок (что означает, никаких приглашений для повторной отправки данных формы).
Что я пробовал до сих пор:
-
Использование
cookies
для личных и общедоступных токенов: это не работает, потому что сервер не знает, какой куки файл должен выглядеть. Если пользователь нажимает на ссылку из вкладки, запрос отправляет все файлы cookie на всех вкладках, и сервер не знает, какой из них щелкнул по ссылке. -
Сохранение личных токенов в
sessionStorage
: это не работает, потому что когда пользователь нажимает на ссылку, нет способа указать пользовательские заголовки, которые должны отправляться вместе с запросом HTTP GET. -
Запрос страницы с помощью AJAX, а затем переход на страницу в памяти с использованием URI данных: по соображениям безопасности Internet Explorer не разрешает использование URI UATA для содержимого HTML. См. http://msdn.microsoft.com/en-us/library/cc848897%28v=vs.85%29.aspx
-
Использование
<form method="get" enctype="multipart/form-data">
и передача токена с помощью скрытых полей: enctype = "multipart/form-data" поддерживается только для POST. -
Использование
<form method="post" enctype="multipart/form-data">
и передача маркера с помощью скрытых полей: теоретически это должно работать, но теперь пользователю будет предложено повторно отправить данные формы, если он использует кнопку "назад/вперед". -
Запрос страницы с помощью AJAX, а затем переписывание текущей страницы с помощью
document.open(); document.write(); document.close()
. Я пробовал как qaru.site/info/19688/..., так и http://forums.mozillazine.org/viewtopic.php?p=5767285&sid=d6a5a2e8e311598cdbad124e277e0f52#p5767285 и в обоих случаях скрипты в новом блоке<head>
никогда не будет выполняться.
Любые идеи?