首页 > 解决方案 > Chrome 中 X509 证书的无限身份验证

问题描述

我已经在 J​​ava 中实现了 X509 证书身份验证机制

它工作正常,但有一个例外 - 当我尝试在 Chrome 中进行身份验证时,应用程序会无限期地对用户进行身份验证。

但是,当我尝试在 Chrome 的隐身模式或 Mozilla FF 中进行身份验证时,一切正常。

问题代码如下:

 public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain)
            throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)res;

        if (!requiresAuthentication(request, response))
        {
            chain.doFilter(req, res);
            return;
        }
        try
        {
            Authentication authResult = attemptAuthentication(request, response);
            if (authResult == null)
            {
                chain.doFilter(request, response);
                return;
            }
            utils.addCORSHeaders(request, response);
            sessionStrategy.onAuthentication(authResult, request, response);
            securityUtils.setAuthentication(authResult);
            getSuccessHandler().onAuthenticationSuccess(request, response, authResult);
            chain.doFilter(request, response);
        }
        catch (AuthenticationException exception)
        {
            unsuccessfulAuthentication(request, response, chain, exception);
        }
    }

protected boolean requiresAuthentication(@NotNull final HttpServletRequest request,
        final HttpServletResponse response)
{
    return configProperties.isEnabled() &&
            !securityUtils.isAuthenticated() &&
            utils.isRequestContainsCertificate(request) &&
            !(sessionStrategy instanceof NullAuthenticatedSessionStrategy) &&
            !request.getServletPath().contains("login") &&
            !X509AuthUtils.isRequestContainsCookie(request);
}

在第一次身份验证尝试期间!requiresAuthentication返回 false(我们尝试对用户进行身份验证)。

在下一次doFilter调用期间!requiresAuthentication始终返回 true(我们不对用户进行身份验证)

这是正确的,但仅适用于 Mozilla FF 和 Chrome 隐身模式。

在下一次doFilter调用期间的常规 Chrome 中!requiresAuthentication返回 false 并且该过程无限期运行

我调试了代码,发现 !securityUtils.isAuthenticated()返回无效值

该方法如下所示:

public boolean isAuthenticated()
{
    final Authentication existingAuth = getAuthentication();
    return existingAuth != null && existingAuth.isAuthenticated() &&
           !(existingAuth instanceof AnonymousAuthenticationToken);
}

public Authentication getAuthentication()
{
    return SecurityContextHolder.getContext().getAuthentication();
}

由于某种原因,spring 在getAuthentication()方法中返回 null 而它不应该返回。

正如我之前所说,该问题只能在常规 Chrome 中重现,而不能在隐身模式或 Mozilla FF 中重现。

也许我可以进行不同的调试?为什么它发生在 Chrome 而不是 Mozilla FF?

标签: javagoogle-chromeauthenticationspring-security

解决方案


推荐阅读