ColdFusion/Sharepoint Integration - Part 1 - Authenticating

I've been working a bit with Sharepoint lately for some team sites at work and needed a way to dynamically manage some user lists for a given site. Since Sharepoint has a pretty extensive API for interacting with the various bits I figured it would be pretty simple to create a scheduled task in ColdFusion that would pull a list of valid userid from my database and pass the list to Sharepoint to keep the authentication up to date without much intervention on my behalf.

Turns out it wasn't quite all that simple to even connect to the Sharepoint service. My attempts at setting/passing my NT credentials on the webservice call kept resulting in a 401 (Unauthorized) response from the service. Eventually I came across this post from Tom Jordahl that presented a fix. Let me quote Tom's post since he does a good job explaining:

Someone asked me how they could turn on NT Authentication for web service using Apache Axis (the web service used by ColdFusion). By default Axis uses its own HTTP client code, org.apache.axis.transport.http.HTTPSender, to send the XML/SOAP POST requests to a web service. This uses HTTP 1.0 and generally works file.

Axis also supports the Jakarta Commons HTTPClient library, and has since 1.0. To configure Axis to use this instead of its own library you must edit the client-config.wsdd file used by Axis. It gets found on the classpath and generally you don't actually have one and the one built in to axis.jar gets used. The interesting line is the http transport. To switch Axis to use the HTTPClient jar, you would change this:

<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"></transport>
To this:
<transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender"></transport>
Once you have this code configured, Axis will use the HTTPClient library for it HTTP needs. Since the HTTPClient library supports NT Authentication, you just set the username/password on the Stub object as you would normally do for (say) Basic Authentication and it will just work. If you are talking to a .NET web service, you are done.

So as he says, I made the change and "it just worked". I can now interact with the Sharepoint user service. Honestly, I haven't done a thing other then confirm that I can now authenticate at this point. Which is why I named this 'Part 1' - because I have a sinking suspicion that my journey to CF/Sharepoint enlightenment will have a few other bumps along the way.

As a side note, I am a bit unhappy that I had to mod the client-config.wsdd file to get this to work. If anyone knows of a simpler workaround please let me know.



Comments
Can you call a sharepoint webservice with CF 7.1? I made the change you suggested but I can't get past an initial error "Could not generate stub objects for web service invocation" which I believe means it is not event getting to the wsdl. I have spent two days trying to find a working snippet of code on the internet for doing ANYTHING with sharepoint from CF. I got nothing. Here is the code that gives me the aforementioned error:


<Cfset ws=createobject("webservice","http://websitename/sites/sitename/_vti_bin/lists.a...
<Cfdump var="#ws#">
# Posted By Steve Hammonds | 5/20/08 5:46 PM
Dumb questions:

Did you try the url directly in your browser to make sure you can view the WSDL?

Did you restart CF after making the change to the config file?
# Posted By todd sharp | 5/21/08 4:00 PM
Yes, I restarted CF. Typing into my browser works fine too except:

From my desktop I do not have to authenticate in the browser. When I do it from the server (local admin logged in, CF running under with another domain users credentials), I do have to autheticate with my domain credentials.

I don't know how to make this authentication happen in my code. The examples I have seen set the username password AFTER creating the webservice. I can't get that far.
# Posted By Steve Hammonds | 5/22/08 1:56 PM
I made this change and there was no difference in my inability to call sharepoint webserives. We need a much much much more detailed explaination of each step required to make this work.
# Posted By Kier Simmons | 6/5/08 12:27 PM
There will be a detailed article in the next edition of FAQU. Make sure you subscribe.
# Posted By todd sharp | 6/5/08 7:07 PM
When does the next issue of FAQU come out? For that matter is it at all possible to get a preview of this "detailed article" being as I've got a project that's due in a week and a half using this integration and I'm having a devil of a time with it?
# Posted By Jenn | 8/7/08 5:30 PM
Jenn:

Check your email.

Todd
# Posted By todd sharp | 8/7/08 9:12 PM
Todd, thanks again for the help. I've got things connecting and calling and returning and that's great. But I've hit another stumper. This blog seems to get better responses than others I've tried, so here's the question. I have to call the "UpdateListItems" method. It appears to take two parameters, first a String and second an XML snippet that contains the information about what to update. Seemed straightforward enough to call it, but it turns out that passing in the correctly formatted XML as the second parameter results in ColdFusion being unable to find the method call. When I generated the stubs and looked at them closely it looks like that second parameter is actually a microsoft object that contains an array of axis message objects. Any idea how you're supposed to pass that? Most of the list manipulation methods take these "XMLNode" input parameters, but passing XML to them does not actually work. I'm at a complete loss.
# Posted By Jenn | 8/8/08 2:44 PM
Steve,
I don't know if you're still following this post or not, but I bet your problem is one that I was having earlier. If the WSDL is actually using NTLM then you can't authenticate against it and you can't get the stubs to generate. To solve the problem access the WSDL from your browser and save it into a folder on your webserver. Then point your CFObject call to the file you've saved on your server. This will let the stubs generate but since the WSDL came off the sharepoint server originally all the method calls will still go to sharepoint. (I can't remember whose blog I found this tidbit on but it sure does work).
# Posted By Jenn | 8/8/08 3:25 PM
Jenn:

Can you email me an example of your call to the service and the error that is being thrown?

Todd
# Posted By todd sharp | 8/8/08 3:48 PM
PS...not sure this makes a difference for your particular problem, but as a general rule I'd suggest using the TCP monitor when working with any web service. It will totally save your sanity sometimes...

http://livedocs.adobe.com/coldfusion/7/htmldocs/ww...
# Posted By todd sharp | 8/8/08 3:51 PM
We've got a project a work on the go at the moment where we need to try and interact with CRM 4 web services. It sounds as though the details article you wrote may have the answers to us having difficulty getting ColdFusion to talk to the CRM 4 web services. Is there any chance that you could email the article to me? Many thanks in advance.
# Posted By Neil Merton | 12/15/08 12:01 PM
Thanks to some idiots who are comment spamming this post non stop I have closed it for comments. If you would like to discuss this post please use my contact page.
# Posted By todd sharp | 12/23/08 3:04 PM
Hi Great Article, I'm new to Sharepoint and this is a great reference to have for our implementation and my planning
# Posted By share point | 1/1/09 3:08 PM
Hey Todd, thanks for another great blog entry. Quick question about this (seems the comments are open again).

You mention getting success with the approach Tom offered, but it seems you had to (as he said) pass the username/password. What if we don't want to prompt the user for that (or retrieve it from somewhere we stored it for them)? Is there any way to pass it along on their behalf?

I've also asked on Tom's blog entry you point to, but I don't know if he'll respond.

Also, did you ever do a part 2? I couldn't find it.
# Posted By Charlie Arehart | 6/11/09 5:08 PM
AFAIK, there's no way around sending the auth credentials with each call.

Also, the next FAQU has my article on CF/SharePoint with some pretty detailed examples (which is essentially part 2 of my blog post). It got bumped from the last issue for some reason, but I'm 95% sure it'll be in the next one that's coming out soon.
# Posted By Todd Sharp | 6/11/09 10:39 PM

Calendar

Sun Mon Tue Wed Thu Fri Sat
   1234
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Subscribe

Enter your email address to subscribe to this blog.

Tags

actionscript ajax blogging cfsnippets coldfusion flash forms flex funny stuff javascript misc model-glue off topic personal project learn slidesix sql

Recent Comments

Adding Auto Generated Code Downloads to BlogCFC
ada5fsa said: http://www.ibiblio.org/st... http://www.ncaonline.org/...... [More]

Chinese Birth Calendar Accuracy Test
mama to be said: ok so i will be 2 months shy of 18 when i have my baby. this calendar does not technically work for ... [More]

Fixing 'User Profile Service Failed The Logon' on Vista
Mike said: That fix worked although all i did was remove .bak and reset state to 0. User was able to log in to... [More]

Chinese Birth Calendar Accuracy Test
Melissa said: Wrong for my daughter, which it predicted to be a boy... we'll see for #2. Predicts a girl (maybe, f... [More]

Adding Auto Generated Code Downloads to BlogCFC
fweerw said: http://www.ibiblio.org/st... http://www.cambodia.ait.a...... [More]

RSS


adobe community experts

coldfusionbloggers

FullAsAGoog MXNA

Consumed By Feed-Squirrel.com