HttpClient使用NTLM身份验证提供程序提供协商错误

Bob*_*ule 4 java authentication ntlm apache-httpclient-4.x

我通过以下方式“强制” httpclient进行ntlm身份验证:

    PoolingHttpClientConnectionManager connPool  connPool = new PoolingHttpClientConnectionManager();

    Lookup<AuthSchemeProvider> authProviders = RegistryBuilder.<AuthSchemeProvider>create()
            .register(AuthSchemes.NTLM, new NTLMSchemeFactory())                
            .build();

    CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connPool).setDefaultAuthSchemeRegistry(authProviders).build();
Run Code Online (Sandbox Code Playgroud)

但是,在对服务器进行身份验证时,我收到一条烦人的日志消息“不支持身份验证方案协商”。

我如何摆脱此消息?

(这将在Linux机器上运行,因此HttpClient 4.4 JNA对本机身份验证的支持将无济于事。)

ok2*_*k2c 5

我认为这非常简单。实际上,客户端只愿意做,NTLM而服务器只愿意做Negotiate,因此无法就通用的身份验证方案达成共识。

这是一种可以调整身份验证方案首选项以强制HttpClient在SPNEGO / Kerberos之上选择NTLM的方式

RequestConfig config = RequestConfig.custom()
        .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.KERBEROS, AuthSchemes.SPNEGO))
        .build();
CloseableHttpClient client = HttpClients.custom()
        .setDefaultRequestConfig(config)
        .build();
Run Code Online (Sandbox Code Playgroud)

  • 警告消息是您的代码禁用Negotiate作为受支持的身份验证方案的直接结果。如果要消除此警告,请不要覆盖身份验证方案提供的默认设置,而应使用自定义身份验证方案首选项 (2认同)