Очистить состояние SSL на стороне клиента при выходе из системы (используя двусторонний SSL)
Я работаю над проектом, который требует двусторонней аутентификации для идентификации пользователя на сервере. Затем сервер отображает информацию и параметры, доступные этому пользователю, в зависимости от их личности.
Я положил 'Выход' ссылка на основной шаблон. Цель этого состоит в том, чтобы аннулировать / очистить все и перенаправить их на небезопасную страницу, которая говорит:Вы вышли из системы. с 'Войти в систему' кнопка, которая перенаправит их обратно на страницу входа.
Страница входа в систему должна запросить у пользователя сертификат (и это происходит в первый раз). Но когда вы нажимаетеВойти в систему' кнопка на странице выходаs использует состояние SSL от предыдущего пользователя и не запрашивает сертификат.
Что мне действительно нужно, так это метод выхода из системы (предпочтительно не использовать сценарий Java), который очистит весь кэш, сделает недействительными все объекты сеанса и очистит состояние SSL.
Вот'что ядо сих пор сделали:
1.) Установите ограничение безопасности в web.xml, которое принудительно заставляет любой шаблон соответствия страниц '/ Безопасный / *» быть доступным только через https. Это работает отлично ...
2.) Создан фильтр, который предотвращает кеширование ...
3.) Создана функция для выхода ...
Любая помощь будет очень признательна!
Код фильтра:
@WebFilter("/secure/*")
public class NoCacheFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
httpResponse.setHeader("Pragma", "no-cache");
httpResponse.setDateHeader("Expires", 0L); // Proxies.
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {}
}
Функция выхода
public void signOut() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
// Log Out of the Session
request.logout();
// Invalidate the Session objects
externalContext.invalidateSession();
if (externalContext.getRequestCookieMap().get(OPEN_TOKEN_COOKIE) != null) {
externalContext.addResponseCookie(OPEN_TOKEN_COOKIE,null,Collections.singletonMap("maxAge", 0));
}
// Redirect to the Sign out page
String signOutURL = MessageFormat.format("http://{0}{1}/{2}",externalContext.getRequestServerName(),externalContext.getRequestContextPath(),"goodbye.jsf");
externalContext.redirect(signOutURL);
}
---------------------- Редактировать ----------------------
Я знаю, что я сказал, что яЯ бы предпочел не использовать JavaScript, но я буду, пока не найду лучшее решение, и яподелюсь как ямы сделали это с тобой.
m с помощью кнопки PrimeFaces с действием, указывающим на ссылки на функцию signOut ранее. Параметр oncomplete указывает на JavaScript, который очищает состояние SSL для Internet Explorer и Firefox (убежищедругие пока не пробовали).
Кнопка выхода
JavaScript clearSSLState ()
function clearSSLState() {
document.execCommand("ClearAuthenticationCache");
window.crypto.logout();
}
Это'Важно отметить, что моя страница goodbye.xhtml НЕ находится в моей папке / secure /. Если это так, пользователю будет сразу предложено выбрать сертификат. Это вызвано ограничением безопасности в web.xml и является правильным поведением.
ограничение безопасности web.xml
Protected Context
/secure/*
CONFIDENTIAL
Надеюсь, что это помогает другим.