Hi,
your mileage might be different but I got the following to
work.
Server:
windows 2003, .net web service with a single helloWorld method,
Service1.asmx Properties the "Enable anonymous access" is
unchecked and only "Integrated Windows authentication" is enabled.
Client:
same box, axis 1.2, java 1.5.0_01-b08. Able to call the .net
web service.
I did the following
0. Ran WSDL2Java to build the stub classes
1. In one of the generated classes I added my username, password
Service1SoapStub.java
...
_call.setUsername("<domain>\\<username>");
_call.setPassword("<my password>");
3. compiled the files
4. created a client-config.wsdd file, I got this from the
axis.jar file. Updated
http ... http.CommonsHTTPSender
5. add this to CLASSPATH before the axis.jar
6. also added commons-httpclient-3.0-rc3.jar
and commons-codec-1.3.jar
Cheers
--- On Tue 06/28, Martin Woodward < [EMAIL PROTECTED] > wrote:
From: Martin Woodward [mailto: [EMAIL PROTECTED]
To: [email protected]
Date: Tue, 28 Jun 2005 15:05:37 +0100
Subject: Re: NTLM Authentication (again)
The latest version (3.0 RC3) of the Commons HttpClient works just fine<br>with
NTLM. Which suggests to me that something is going funny in
the<br>org.apache.axis.transport.http.CommonsHTTPSender class. I'll
dig<br>around in the CommonsHTTPSender class, but I was wondering if
anyone<br>had come across this before or actually got NTLM
working...<br><br>Below is the code I used that just used the Commons
HTTPClient class<br>to get an NTLM protected message (changed slightly to
protect the<br>innocent). I tried it against the same web service method that
my<br>WDSL2Java generated call eventually winds up
calling...<br><br>-----<br><br>package com.mrwpro.vsts.play;<br><br>import
java.io.IOException;<br><br>import
org.apache.commons.httpclient.Credentials;<br>import
org.apache.commons.httpclient.HttpClient;<br>import
org.apache.commons.httpclient.HttpException;<br>import
org.apache.commons.httpclient.HttpMethodBase;<br>import
org.apache.commons.httpclient.NTCredentials;<br>import
org.apache.commons.httpclient.auth.AuthScope;<br>import
org.apache.commons.httpclient.methods.GetMethod;<br><br>/**<br> * Get a NTLM
secured page. <br> * @author martinwoodward<br> */<br>public class NTLMHttpTest
{<br><br> public static void main(String[] args) {<br> <br>
HttpClient httpClient = new HttpClient();<br> Credentials credentials = new
NTCredentials("username",<br>"password", "remoteMachine", "MY_DOMAIN");<br>
httpClient.getState().setCredentials(AuthScope.ANY,credentials);<br>
HttpMethodBase method =
new<br>GetMethod("http://remoteMachine/WebService/MyService.asmx/WhoAmI");<br>
<br> try {<br> int returnCode = httpClient.executeMethod(method);<br>
String response = method.getResponseBodyAsString();<br>
System.out.println("Response: " + response);<br> } catch (HttpException e)
{<br> e.printStackTrace();<br> } catch (IOException e) {<br>
e.printStackTrace();<br>
}<br> <br>
}<br>}<br><br>-----<br><br>Thanks,<br><br>Martin.<br><br><br><br><br><br>On
28/06/05, Evgeny Beskrovny <[EMAIL PROTECTED]> wrote:<br>> I suggest you to
write the code using the classes of Apache that connect to<br>> the NTLM server
and see if it works. There is a big chance that it won't<br>> work since as far
as I remember they don't support different parameters<br>> that can be set in
NTLM for example usage of NTLM2 that server during the<br>> NTLM handshake
might prescribe client to do.<br>> Evgeny<br>> <br>> Martin
Woodward<br>> <martin.woodward@<br>> gmail.com>
To<br>>
[email protected]<br>> 06/28/2005 01:30
cc<br>> PM<br>>
Subject<br>>
Re: NTLM Authentication
(again)<br>> Please respond to<br>> [EMAIL
PROTECTED]<br>> he.org<br>> <br>> I'm pretty sure that that
the Commons HTTPClient implementation (used<br>> by CommonsHTTPSender) has an
implementation of NTLM in 3.0-RC3. If I<br>> take out my credentials from the
call then I get the following error<br>> when talking via the proxy<br>> <br>>
No credentials available for NTLM <any realm>@mymachine:80<br>> <br>> Which
would suggest that it is the Commons HTTPClient code that<br>> negotiating, not
TCPMon.<br>> <br>> I am not creating the HTTP connection directly. I am using
a<br>> WSDL2Java generated stub which I have added a couple of lines to
add<br>> my credentials to the _call in the createCall method. I have
then<br>> used the client-config.wsdd to override the default transport<br>>
implementaion to the Commons one (which has NTLM support)<br>> <br>> Below if
the contents of my client-config.msdd file...<br>> <br>> <?xml version="1.0"
encoding="UTF-8"?><br>> <deployment name="defaultClientConfig"<br>>
xmlns="http://xml.apache.org/axis/wsdd/"<br>>
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><br>>
<globalConfiguration><br>> <parameter name="disablePrettyXML"
value="true"/><br>> </globalConfiguration><br>> <transport name="http"<br>>
pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"/><br>> <!--
transport name="http"<br>>
pivot="java:org.apache.axis.transport.http.HTTPSender"/ --><br>> <transport
name="local"<br>>
pivot="java:org.apache.axis.transport.local.LocalSender"/><br>> <transport
name="java"<br>> pivot="java:org.apache.axis.transport.java.JavaSender"/><br>>
</deployment><br>> <br>> I think it is actually the<br>>
org.apache.axis.transport.http.CommonsHTTPSender class that creates<br>> the
URL connection - please let me know if I doing something daft or<br>> have
mis-understood your point.<br>> <br>> Cheers,<br>> <br>> Martin.<br>> <br>> On
28/06/05, Evgeny Beskrovny
<[EMAIL PROTECTED]> wrote:<br>> > Hi,<br>> > I think the reason it doesn't work
for you is because in order to make it<br>> > work you need to have a Sun
implementation of HTTPUrlConnection on a<br>> > client, while here as I
understand you use HttpClient of Apache that<br>> might<br>> > have no
implementation of NTLM. When you connect to a proxy it internally<br>> > uses
Sun implementation of HTTPUrlConnection so it works.<br>> > When you create a
URL on your client you would better use it this way<br>> ><br>> > handler = new
sun.net.www.protocol.http.Handler();<br>> > urlToConnect = new URL (null,
urlPath.toString(),handler);<br>> > URLConnection connection =
urlToConnect.openConnection();<br>> > Try this and see if it works.<br>> >
Evgeny<br>> ><br>> > Martin Woodward<br>> >
<martin.woodward@<br>> > gmail.com>
To<br>> >
[email protected]<br>> > 06/27/2005 08:30
cc<br>> > PM<br>> >
Subject<br>> >
NTLM Authentication (again)<br>> > Please respond
to<br>> > [EMAIL PROTECTED]<br>> > he.org<br>>
><br>> ><br>> > Hi,<br>> ><br>> > I'm trying to talk to a web service that
requires NTLM authentication<br>> > for my sins. The good news is that it
works, the bad news is that I<br>> > have to proxy the request through a local
instance of TCPmon to get it<br>> > to work. Does this sound familiar to
anyone, I could very possibly be<br>> > me doing something dumb...<br>> ><br>>
> I am using axis-1_2_1, commons-httpclient-3.0-rc3, commons-codec-1.3<br>> >
on j2sdk1.4.2_08 running in Windows XP Pro SP2.<br>> ><br>> > As I say,
everything works fine if I run up TCPMonitor on my machine<br>> >
and then include the following lines in my client...<br>> ><br>> >
System.setProperty("http.proxyHost", "localhost");<br>> >
System.setProperty("http.proxyPort", "8888");<br>> ><br>> > I've allready
edited my stub to add the username/password and added a<br>> >
client-config.wsdd to point to the CommonsHTTPSender.<br>> ><br>> > Below is
the stack trace when I don't have the web service call proxied:-<br>> ><br>> >
AxisFault<br>> > faultCode:<br>>
{http://schemas.xmlsoap.org/soap/envelope/}Server.userException<br>> >
faultSubcode:<br>> > faultString: java.net.SocketException: Connection
reset<br>> > faultActor:<br>> > faultNode:<br>> > faultDetail:<br>> ><br>> >
{http://xml.apache.org/axis/}stackTrace:java.net.SocketException:<br>> >
Connection reset<br>> > at<br>>
java.net.SocketInputStream.read(SocketInputStream.java:168)<br>> >
at<br>> > java.io.BufferedInputStream.fill(BufferedInputStream.java:183)<br>> >
at<br>> >
java.io.BufferedInputStream.read(BufferedInputStream.java:201)<br>> >
at<br>> >
org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)<br>> >
at<br>> >
org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)<br>> >
at<br>> ><br>>
org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1110)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1391)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1592)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)<br>>
<br>> ><br>> >
at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:393)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:168)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)<br>>
> at<br>> ><br>>
org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:188)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)<br>>
<br>> ><br>> > at<br>> >
org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)<br>> >
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)<br>> >
at<br>> > org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)<br>> >
at org.apache.axis.client.Call.invokeEngine(Call.java:2765)<br>> >
at
org.apache.axis.client.Call.invoke(Call.java:2748)<br>> > at
org.apache.axis.client.Call.invoke(Call.java:2424)<br>> > at
org.apache.axis.client.Call.invoke(Call.java:2347)<br>> > at
org.apache.axis.client.Call.invoke(Call.java:1804)<br>> > at
SNIP.whoAmI(SNIP.java:430)<br>> > at
com.mrwpro.vsts.play.TestClient.main(TestClient.java:30)<br>> ><br>> >
{http://xml.apache.org/axis/}hostname:tst-028-04452<br>> ><br>> >
java.net.SocketException: Connection reset<br>> > at
org.apache.axis.AxisFault.makeFault(AxisFault.java:101)<br>> >
at<br>> ><br>>
org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:277)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)<br>>
<br>> ><br>> > at<br>> >
org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)<br>> >
at
org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)<br>> >
at<br>> > org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)<br>> >
at org.apache.axis.client.Call.invokeEngine(Call.java:2765)<br>> >
at org.apache.axis.client.Call.invoke(Call.java:2748)<br>> >
at org.apache.axis.client.Call.invoke(Call.java:2424)<br>> > at
org.apache.axis.client.Call.invoke(Call.java:2347)<br>> > at
org.apache.axis.client.Call.invoke(Call.java:1804)<br>> > at
SNIP.whoAmI(SNIP.java:430)<br>> > at
com.mrwpro.vsts.play.TestClient.main(TestClient.java:30)<br>> > Caused by:
java.net.SocketException: Connection reset<br>> > at<br>>
java.net.SocketInputStream.read(SocketInputStream.java:168)<br>> >
at<br>> > java.io.BufferedInputStream.fill(BufferedInputStream.java:183)<br>> >
at<br>> >
java.io.BufferedInputStream.read(BufferedInputStream.java:201)<br>> >
at<br>> >
org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)<br>> >
at<br>> >
org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)<br>> >
at<br>> ><br>>
org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1110)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1391)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1592)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:393)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:168)<br>>
<br>> ><br>> > at<br>> ><br>>
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)<br>>
> at<br>> ><br>>
org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:188)<br>>
<br>> ><br>> > ... 11 more<br>> ><br>> > When I do have it
proxied, you see the 401 error coming back from the<br>> > server, followed by
a 100 with the final 200 response containing the<br>> > answer. When I run
pointing to the proxy I also get the following<br>> > console output...<br>>
><br>> > - Unable to find required classes (javax.activation.DataHandler
and<br>> > javax.mail.internet.MimeMultipart). Attachment support is
disabled.<br>> > - ntlm authentication scheme selected<br>> > -
Discarding unexpected response: HTTP/1.1 100 Continue<br>> ><br>> > Any
ideas?<br>> ><br>> > Thanks,<br>> ><br>> > Martin.<br>> ><br>> > --<br>> ><br>>
> http://www.woodwardweb.com<br>> ><br>> ><br>> <br>> --<br>> <br>>
http://www.woodwardweb.com<br>> <br>> <br><br><br>--
<br><br>http://www.woodwardweb.com<br>
_______________________________________________