Очистить состояние SSL-сертификата клиента из JavaScript
Я использую клиентские сертификаты в сеансах SSL для аутентификации пользователей, но у меня есть небольшая проблема с кэшированными сеансами. (Я настроил IIS для приема - не требовать - клиентских сертификатов.)
Нормальная ситуация:
Пользователь получает доступ к странице, которая запрашивает сертификат. Браузер запускает селектор сертификатов, пользователь выбирает нужный сертификат (и при необходимости вводит PIN-код), и все идет вперед, как и должно.
Ситуация, когда все работает не так, как ожидалось:
Пользователь получает доступ к странице, которая запрашивает сертификат. Браузер запускает селектор сертификатов, и пользователь выбирает нужный сертификат, но затем отменяет его в диалоговом окне PIN-кода. Пользователь перенаправлен на предыдущую страницу, потому что сертификат не был отправлен. Пользователь пытается войти снова, но попытка автоматически завершается неудачей, поскольку последний сеанс SSL был кэширован.
Я решил это в IE, используя document.execCommand("ClearAuthenticationCache");
, но это все еще не работает в FF или Chrome, потому что они не поддерживают метод. Есть ли способ решить это?
3 ответа
Возможно, вас заинтересует эта дискуссия и проблема Chromium. В частности, вы должны попробовать:
if (window.crypto) window.crypto.logout();
Для Chrome (по крайней мере в бета-версии 19.0.1084.30) кажется, что если вы можете настроить URL-адрес на том же имени хоста, который требует сертификат клиента, но отклоняет все сертификаты, то выполнение запроса на этот URL будет иметь тот же эффект, что и window.crypto.logout()
, Например, если /ssl_logout/
это специально настроенный URL:
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
// put any actions to carry out upon logout here
};
xmlHttp.open( "GET", "/ssl_logout/", true );
xmlHttp.send();
(Используя страницу, содержащую iframe
или же img
с src="/ssl_logout/"
тоже работает.)