java - HttpClient 给出与 NTLM 身份验证提供程序的协商错误

标签 java authentication apache-httpclient-4.x ntlm

我“强制”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();

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

我怎样才能摆脱这条消息?

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

最佳答案

我觉得一切都很简单。实际上,客户端只愿意执行 NTLM,而服务器只愿意执行 Negotiate,因此无法就通用身份验证方案达成一致。

这是调整身份验证方案首选项以强制 HttpClient 选择 NTLM 而不是 SPNEGO/Kerberos 的方法

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

关于java - HttpClient 给出与 NTLM 身份验证提供程序的协商错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28680965/

相关文章:

java - GSON将json值反序列化为Java对象

java - 如何更改列表的值并在 hibernate 中更新列表?

java - EclipseLink 生成 id,同时非 jpa 进程也在添加记录

node.js - 使用环境变量中的 token 从私有(private) Github 存储库安装 NPM 包

java - 签名的 Java Applet 访问被拒绝 java.io.FilePermission 读取

Ubuntu 14.04 登录循环

android - 无法向服务器发送登录请求

java - 在 Java 中计算 HTTP 请求的时间指标

java - Apache HttpClient session 不起作用

java - Httpclient 未正确缓存响应