Очистить состояние сертификата клиента SSL от JavaScript

Я использую клиентские сертификаты в сеансах SSL для аутентификации пользователей, но у меня есть небольшая проблема с кэшированными сеансами. (Я настроил IIS для приема-не требуется-клиентских сертификатов.)

нормальная ситуация:
Пользователь обращается к странице, которая запрашивает сертификат. Браузер запускает селектор сертификатов, пользователь выбирает нужный сертификат (и при необходимости вводит PIN-код), и все идет как надо.

ситуация, когда все работает не так, как ожидалось:
Пользователь обращается к странице, которая запрашивает сертификат. Браузер запускает селектор сертификатов, и пользователь выбирает нужный сертификат, но затем отменяет в диалоговом окне PIN-код. Пользователь переходит на предыдущую страницу, так как сертификат не был отправлен. Пользователь пытается снова войти в систему, но попытка автоматически завершается неудачей, так как последний сеанс SSL был кэширован.

Я решил это в IE, используя document.execCommand("ClearAuthenticationCache");, но он все еще не работает в FF или Хром, потому что они не поддерживают метод. Есть ли способ решить эту проблему?

3 ответов


вас может заинтересовать эта дискуссия и эта проблема хрома. В частности, вы должны попробовать:

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/" тоже работает.)


в IE6+:

document.execCommand('ClearAuthenticationCache');