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.