有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HttpClient与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();

但是,当向服务器进行身份验证时,我会收到一条恼人的日志消息“Authentication scheme Agreement not supported”

我怎样才能摆脱这个信息

(这将在linux机器上运行,因此对本机身份验证的HttpClient 4.4 JNA支持没有帮助。)


共 (1) 个答案

  1. # 1 楼答案

    我认为这一切都很简单。实际上,客户端只愿意执行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();