Wyczyść stan strony klienta po wylogowaniu (przy użyciu dwukierunkowego protokołu SSL)

Pracuję nad projektem, który wymaga dwukierunkowego uwierzytelnienia, aby zidentyfikować użytkownika na serwerze. Następnie serwer wyświetla informacje i opcje dostępne dla tego użytkownika na podstawie ich tożsamości.

W głównym szablonie umieściłem link „Wyloguj się”. Ma to na celu unieważnienie / usunięcie wszystkiego i przekierowanie ich na niezabezpieczoną stronę z napisem „Wylogowano się”. z przyciskiem „Zaloguj się”, który przekieruje ich z powrotem do strony logowania.

Strona logowania powinna monitować użytkownika o ich certyfikat (i robi to za pierwszym razem). Ale po kliknięciu przycisku „Zaloguj się” na stronie Wylogowano używa się stanu SSL poprzedniego użytkownika i nie pojawia się monitowanie o certyfikat.

Naprawdę potrzebuję metody wylogowania (wolę nie używać skryptu java), która usunie całą pamięć podręczną, unieważni wszystkie obiekty sesji I wyczyści stan SSL.

Oto co zrobiłem do tej pory:

1.) Skonfiguruj ograniczenie bezpieczeństwa w pliku web.xml, które zmusza każdą stronę pasującą do wzorca „/ secure / *”, aby była dostępna tylko przez https. To działa świetnie ...

2.) Utworzono filtr, który zapobiega pamięci podręcznej ...

3.) Utworzono funkcję do wylogowania ...

Każda pomoc byłaby WIELKA doceniona!

Filtruj kod:

@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() {}
}

Wyloguj się

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.<String, Object>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);
}

---------------------- Edytować ----------------------

Wiem, że stwierdziłem, że wolę nie używać JavaScript, ale dopóki nie znajdę lepszego rozwiązania, podzielę się tym, jak to zrobiłem z tobą.

Używam przycisku PrimeFaces z akcją wskazującą na odwołania do funkcji signOut wcześniej. Parametr oncomplete wskazuje na JavaScript, który czyści stan SSL dla Internet Explorera i Firefoksa (jeszcze nie próbowałem innych).

Przycisk Wyloguj

<p:commandButton value="Sign out" action="#{adminNavigationBean.signOut}" oncomplete="clearSSLState();" styleClass="commandButton"/>

JavaScript clearSSLState ()

<script type="text/javascript">
    function clearSSLState() {
        document.execCommand("ClearAuthenticationCache");
        window.crypto.logout();
    }
</script>

Ważne jest, aby pamiętać, że moja strona goodbye.xhtml NIE znajduje się w moim / secure / folderze. Gdyby tak było, użytkownik byłby natychmiast proszony o wybranie certyfikatu. Jest to spowodowane ograniczeniem bezpieczeństwa w pliku web.xml i jest poprawnym zachowaniem.

ograniczenie web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Context</web-resource-name>
        <url-pattern>/secure/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Mam nadzieję, że to pomaga innym.

questionAnswers(0)

yourAnswerToTheQuestion