Fir*_*cer 2 java http apache-httpclient-4.x
我正在尝试将HttpClient创建为支持NTLM和Basic身份验证的服务.在我的情况下,NTLM将无法工作,因为HttpClient机器处于与服务不同的域下(感谢公司决定非常缓慢地迁移正在使用的域的名称......).但是看起来HttpClient仍然会尝试使用它.
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(
username, password));
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(credentialsProvider).build();
HttpGet method = new HttpGet(uri);
HttpResponse response = client.execute(method);
Run Code Online (Sandbox Code Playgroud)
严重:[WARN] HttpAuthenticator - NEGOTIATE身份验证错误:未提供有效凭据(机制级别:未提供有效凭据(机制级别:无法找到任何Kerberos tgt))严重:[WARN] HttpAuthenticator - NTLM身份验证错误:凭据无法使用对于NTLM身份验证:org.apache.http.auth.UsernamePasswordCredentials
我只是想让它发送HTTP Authentication: Basic ...标头.我已经在任何Java HTTP框架之外测试了这个(例如使用带有手动创建的HTTP请求的原始ssl套接字),所以它似乎是一些Java/Apache HTTP问题,它尝试做我没有要求的事情而且真的不喜欢我希望它甚至试图做...
但是看起来HttpClient仍然会尝试使用它.
这是因为表现良好的客户端应该选择比本质上不安全的BASIC auth更安全的方案.
这就是永久禁用NTLM(和其他非标准方案)的方法
Registry<AuthSchemeProvider> r = RegistryBuilder.<AuthSchemeProvider>create()
.register(AuthSchemes.BASIC, new BasicSchemeFactory())
.register(AuthSchemes.DIGEST, new DigestSchemeFactory())
.build();
CloseableHttpClient client = HttpClients.custom()
.setDefaultAuthSchemeRegistry(r)
.build();
Run Code Online (Sandbox Code Playgroud)
这就是为什么人们可以强制HttpClient在每个请求的基础上选择基于NTLM的BASIC
RequestConfig config = RequestConfig.custom()
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC, AuthSchemes.NTLM))
.build();
HttpGet get = new HttpGet("/");
get.setConfig(config);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7522 次 |
| 最近记录: |