java - java - HttpClient 不使用 NTLM 进行身份验证
问题描述
尝试连接到受 NTLM 身份验证保护的资源。发出请求时,我收到未经身份验证的响应 401,但之后 httpclient 不执行 NTLM 身份验证。
添加了拦截器以查看通信,它甚至不尝试进行身份验证:
Request:
POST/NAV/xxxxxxxxx
Content-type: text/xml; charset=utf-8
SOAPAction:
Content-Length: 359
Host: xxx.local:7051
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.4 (Java/1.8.0_181)
Accept-Encoding: gzip,deflate
Response:
Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
Date: Wed, 26 Sep 2018 10:37:56 GMT
之后没有提出任何要求。
有什么建议吗?
这是我的代码:
NTCredentials credentials = new NTCredentials("testuser", "pass1", null, "stt.local");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY, credentials);
ArrayList<String> authPrefs = new ArrayList<String>();
authPrefs.add(AuthSchemes.NTLM);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(30000)
.setConnectTimeout(30000)
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM))
.setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
.build();
HttpClient client = HttpClientBuilder.
create().
setDefaultCredentialsProvider(credsProvider).
setDefaultRequestConfig(requestConfig).
addInterceptorLast(new LoggingRequestInterceptor()).
addInterceptorLast(new LoggingResponseInterceptor()).
build();
HttpPost post = new HttpPost(endpoint); //Provide Request URL
try {
StringEntity input = new StringEntity(bodyAsString);
input.setContentType("text/xml; charset=utf-8");
post.setEntity(input);
post.setHeader("Content-type", "text/xml; charset=utf-8");
post.setHeader("SOAPAction", ""); //Provide Soap action
org.apache.http.HttpResponse response = client.execute(post);
}
解决方案
该NTCredentials
构造函数的参数应具有单独的用户名和域名。
参数:
userName - 用户名。这不应包括要进行身份验证的域。例如:“user”是正确的,而“DOMAIN\user”不是。
密码 - 密码。
工作站 - 身份验证请求源自的工作站。本质上,这台机器的计算机名称。
domain - 要在其中进行身份验证的域。
推荐阅读
- linkedin - 使用 Linkedin 进行单点登录不断询问使用 API v1 登录的用户的授权
- sql - 如何在 SQL 的两个表中获取具有不常见值的行?
- wordpress - 是否有任何条件可以在联系表格 7 的单选按钮中选择最多 3 个字段
- inno-setup - 单击 Inno Setup 中的 Finish 按钮后,根据自定义复选框运行文件和程序
- javascript - 如果对象键存在,我如何格式化响应?
- python - 一列中的更改也应该在另一列中进行更改
- r - 如何在 R 中为 6000 次迭代构建重复循环?
- node.js - Express 4,将 req.path 与 URL 参数匹配
- java - JSON Volley PUT 请求覆盖一切
- mysql - Sails.js:如何为记录做更新日期?