Limpar o estado SSL do lado do cliente no logout (usando SSL bidirecional)

Eu estou trabalhando em um projeto que requer autenticação bidirecional para identificar o usuário para o servidor. O servidor, em seguida, mostra informações e opções disponíveis para esse usuário com base em sua identidade.

Eu coloquei um link "Sair" no modelo principal. A intenção disso é invalidar / limpar tudo e redirecioná-los para uma página não segura que diz "Você foi desconectado". com um botão "Login" que irá redirecioná-los de volta à página de login.

A página de login deve solicitar ao usuário seu certificado (e o faz pela primeira vez). Porém, quando você clica no botão "Fazer login" na página desconectada, está usando o estado SSL do usuário anterior e não ocorre nenhum aviso de confirmação.

O que eu realmente preciso é um método de logout (prefiro não usar o script java) que irá limpar todo o cache, invalidar todos os objetos de sessão e limpar o estado SSL.

Aqui está o que eu fiz até agora:

1.) Configure uma restrição de segurança no web.xml que force qualquer padrão de correspondência de página '/ secure / *' a ser acessível apenas por meio de https. Isso está funcionando muito bem ...

2.) Criado um filtro que impede o cache ...

3.) Criada uma função para sair ...

Toda e qualquer ajuda seria muito apreciada!

Código de filtro:

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

Função de saída

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

---------------------- Editar ----------------------

Sei que afirmei que preferiria não usar JavaScript, mas farei até encontrar uma solução melhor e compartilharei como fiz isso com você.

Eu estou usando um botão PrimeFaces com a ação apontando para as referências de função signOut anteriormente. O parâmetro oncomplete aponta para um JavaScript que limpa o estado SSL do Internet Explorer e do Firefox (ainda não experimentou outros).

Botão Sair

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

É importante observar que minha página goodbye.xhtml NÃO está na pasta / secure /. Se fosse, o usuário seria imediatamente solicitado a selecionar um certificado. Isso é causado pela restrição de segurança em web.xml e é o comportamento correto.

restrição de segurança 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>

Espero que isso ajude os outros.

questionAnswers(0)

yourAnswerToTheQuestion