Android 中使用 ksoap2 的 NTLM 身份验证
NTLM Authentication with ksoap2 in Android
我正在使用 ksoap2 3.6。
我正在尝试访问受 NTLM 保护的 soap 网络服务。我找到了 ksoap2-extra-ntlm-3.6.0.jar 文件并将其添加到我的项目中,认为这是我的救星。
NtlmTransport ntlmTransport = new NtlmTransport(BASE_URL);
ntlmTransport.setCredentials(USERNAME, PASSWORD, DOMAIN, "");
ntlmTransport.call(name_space + method_name, envelope);
但是,我收到未经授权的 401 响应代码。我已经通过 .NET 和基于浏览器的身份验证方法验证了我的用户名、密码和域,所以我知道它们是正确的。
问题:我如何实际验证并通过 401 代码?
谢谢。
这对我有用。
由于ksoap2是开源的,我偷看了NtlmTransport的代码,修改了调用方式如下
我删除了:
BasicHttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, this.timeout);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
client.getAuthSchemes().register("ntlm", new NtlmTransport.NTLMSchemeFactory());
NTCredentials credentials = new NTCredentials(this.user, this.password, this.ntWorkstation, this.ntDomain);
client.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
并将该代码替换为以下代码:
NTCredentials ntCredentials = new NTCredentials(user, password, ntWorkstation, ntDomain );
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY), ntCredentials);
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder.useSystemProperties();
clientBuilder.setDefaultCredentialsProvider(credentialsProvider);
CloseableHttpClient client = clientBuilder.build();
我用 try...finally 块包装了执行和响应代码,以在 finally 块中关闭客户端。现在效果很好。
我加了
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
到我的 gradle 文件。
认为有人可能会受益。
谢谢。
我正在使用 ksoap2 3.6。
我正在尝试访问受 NTLM 保护的 soap 网络服务。我找到了 ksoap2-extra-ntlm-3.6.0.jar 文件并将其添加到我的项目中,认为这是我的救星。
NtlmTransport ntlmTransport = new NtlmTransport(BASE_URL);
ntlmTransport.setCredentials(USERNAME, PASSWORD, DOMAIN, "");
ntlmTransport.call(name_space + method_name, envelope);
但是,我收到未经授权的 401 响应代码。我已经通过 .NET 和基于浏览器的身份验证方法验证了我的用户名、密码和域,所以我知道它们是正确的。
问题:我如何实际验证并通过 401 代码?
谢谢。
这对我有用。
由于ksoap2是开源的,我偷看了NtlmTransport的代码,修改了调用方式如下
我删除了:
BasicHttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, this.timeout);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
client.getAuthSchemes().register("ntlm", new NtlmTransport.NTLMSchemeFactory());
NTCredentials credentials = new NTCredentials(this.user, this.password, this.ntWorkstation, this.ntDomain);
client.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
并将该代码替换为以下代码:
NTCredentials ntCredentials = new NTCredentials(user, password, ntWorkstation, ntDomain );
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY), ntCredentials);
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder.useSystemProperties();
clientBuilder.setDefaultCredentialsProvider(credentialsProvider);
CloseableHttpClient client = clientBuilder.build();
我用 try...finally 块包装了执行和响应代码,以在 finally 块中关闭客户端。现在效果很好。
我加了
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
到我的 gradle 文件。
认为有人可能会受益。
谢谢。