Очистить состояние 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
    

Надеюсь, что это помогает другим.

Ответы на вопрос(0)

Ваш ответ на вопрос