Questa cosa davvero bizzarra (vi prego, ditemi che ho qualche grossa lacuna, preferirei...) la scrivo perchè (spero che sia complice qualche festicciola natalizia) mi ha fatto perdere due giorni lavorativi.
Finalmente stasera ho avuto l'illuminazione. Ho dovuto abbandonare la mia razionalità, ma d'altronde Einstein insegna "Imagination is more important than knowledge".
Veniamo al dunque.
Premesso che, fino a lunedì, ancora non avevo mai utilizzato WCF, ho deciso di non farmi problemi ad utilizzarlo per referenziare i web service di SharePoint.
Fin qua tutto ok.
Peccato che poi, alla chiamata di un qualsiasi metodo di un qualsiasi web service (tra quelli di SharePoint ovviamente), ricevo un errore di autenticazione.
Io purtroppo sul discorso security sono un po' carente moltiplicato per la mia carenza WCF crea un bel mondo di incognite...:)
Eppure...mi sembra tutto giusto, perchè non mi autentica con la mia utenza (che tra l'altro è admin del mio sito SharePoint) ?
listService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
listService.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("pippo", "pippo99", "SHARE1");
listService.ClientCredentials.Windows.AllowNtlm = true;
Niente da fare, non mi autentica.
Cerco informazioni un po' su internet, un po' su vari libri di WCF dando la colpa alla mia ignoranza sull'argomento. Chissà come si implementa l'NTLM con WCF...
Niente da fare, tutto mi riporta al fatto che, così come ho fatto è giusto. Anche la sezione Security dell'app.config è ok.
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm"/>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
Mi arrendo e mi dico: proviamo a farlo nella vecchia maniera...ovvero aggiungere il servizio come web service e non come servizio WCF.
Così faccio, cambio leggermente il codice:
listService.Credentials = new NetworkCredential("pippo", "pippo99", "SHARE1");
Stesso errore, ancora non mi autentica. Provo ancora a controllare la validità della mia utenza con il browser ed è ok.
Non capisco cosa devo fare e mi arrovello, perdendo tempo in inutili tentativi.
Alla fine, provo impostando direttamente l'Url del webservice una volta istanziato e...sorpresa: funziona!
Ma come è possibile? E' lo stesso Url con la quale l'ho referenziato, chi l'ha cambiato?!?
Nessuno: Visual Studio, quando viene referenziato un web service di SharePoint, elimina qualsiasi menzione a eventuali sottositi.
Se per esempio quindi il web service referenziato (come nel nostro caso) è:
http://nomedominio.com/sottosito/_vti_bin/lists.asmx
Visual Studio in realtà memorizzerà l'indirizzo così:
http://nomedominio.com/_vti_bin/lists.asmx
Nella logica delle directory virtuali di SharePoint non fa una piega, ma in effetti è chiaro che utilizzare il web service dalla root o da un suo sottosito, non è esattamente la stessa cosa...
Alla fine, sono tornato nel mio progetto dove l'avevo referenziato con WCF, mi è bastato impostare l'Url corretto e...funziona.
listService.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://nomedominio.com/sottosito/_vti_bin/lists.asmx");
Non aggiungo altro.