Clientseitigen SSL-Status beim Abmelden löschen (mit bidirektionalem SSL)

Ich arbeite an einem Projekt, das eine bidirektionale Authentifizierung erfordert, um den Benutzer gegenüber dem Server zu identifizieren. Der Server zeigt dann Informationen und Optionen an, die diesem Benutzer aufgrund seiner Identität zur Verfügung stehen.

Ich habe einen "Abmelden" -Link in die Hauptvorlage eingefügt. Damit soll alles ungültig gemacht / gelöscht und auf eine nicht sichere Seite weitergeleitet werden, auf der steht: "Sie wurden abgemeldet." mit einem "Anmelden" -Button, der sie zurück zur Anmeldeseite leitet.

Die Anmeldeseite sollte den Benutzer zur Eingabe seines Zertifikats auffordern (und dies ist beim ersten Mal der Fall). Wenn Sie jedoch auf der Seite "Abgemeldet" auf die Schaltfläche "Anmelden" klicken, wird der SSL-Status des vorherigen Benutzers verwendet, und es erfolgt keine Zertifikatsabfrage.

Was ich wirklich brauche, ist eine Abmeldemethode (lieber kein Java-Skript verwenden), die den gesamten Cache löscht, alle Sitzungsobjekte ungültig macht UND den SSL-Status löscht.

Folgendes habe ich bisher getan:

1.) Richten Sie in der Datei web.xml eine Sicherheitsbeschränkung ein, die den Zugriff auf Seiten mit dem Muster '/ secure / *' nur über https erzwingt. Das funktioniert super ...

2.) Erstellt einen Filter, der den Cache verhindert ...

3.) Erstellt eine Funktion zum Abmelden ...

Jede Hilfe wäre sehr dankbar!

Filtercode:

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

Abmeldefunktion

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);
}

---------------------- Bearbeiten ----------------------

Ich weiß, dass ich angegeben habe, dass ich kein JavaScript verwenden möchte, aber ich werde es tun, bis ich eine bessere Lösung gefunden habe, und ich werde Ihnen mitteilen, wie ich es gemacht habe.

Ich verwende eine PrimeFaces-Schaltfläche, deren Aktion auf die Referenzen der signOut-Funktion verweist. Der Parameter oncomplete verweist auf ein JavaScript, das den SSL-Status für Internet Explorer und Firefox löscht (haben noch keine anderen ausprobiert).

Schaltfläche "Abmelden"

<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>

Es ist wichtig zu beachten, dass sich meine goodbye.xhtml-Seite NICHT in meinem / secure / -Ordner befindet. In diesem Fall wird der Benutzer sofort aufgefordert, ein Zertifikat auszuwählen. Dies wird durch die Sicherheitsbeschränkung in web.xml verursacht und ist das richtige Verhalten.

web.xml Sicherheitsbeschränkung

<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>

Hoffe das hilft anderen.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage