Очистить состояние сертификата клиента 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/"
тоже работает.)