Sharepoint csom

in Sharepoint

Collegare Webapi tramite Csom a Sharepoint

Reading Time: 3 minutes

Ci si può trovare nello scenario di dover esporre dati da Sharepoint Online tramite REST API. Esistono diversi modi per poter raggiungere l’obiettivo, utilizzando ad esempio Azure Logic Apps e PowerApps, ma per ragioni implementative ho avuto la necessità di integrare alcune WebApi esistenti (scritte in .NET) con Sharepoint, tramite CSOM. Nello specifico, una volta ottenuto il token di accesso rilasciato da Sharepoint, le WebApi lo utilizzeranno per eseguire CAML query ed esporre i dati tramite json.

Uno dei prerequisiti di questo tipo di implementazione è il sistema di autenticazione e di permessi tra Sharepoint e WebApi. In particolare, Sharepoint dovrà rilasciare un token di accesso alle WebApi. Le WebApi si presenteranno a Sharepoint tramite ClientId e ClientSecret.

I passi per poter raggiungere l’obiettivo sono:

  • creazione del Clientid e del ClientSecret su Sharepoint per le WebApi: questo passaggio permette di identificare in maniera univoca l’applicazione che dovrà accedere
  • configurazione della WebApi con il ClientId ed il SecretId generato al passo precedente
  • installazione dei pacchetti nuget nella Webpi per poter accedere al context di Sharepoint

I pacchetti nuget da installare sulla WebApi sono:

In particolare AppForSharePointOnlineWebToolkit consente di accedere a Sharepoint utilizzando il token richiesto tramite ClientId e ClientSecret . Questa libreria è piuttosto semplice da utilizzare e spesso sufficiente anche per soddisfare requisiti di prestazione e tempi di risposta.

Passiamo quindi alla parte di registrazione delle Api su Sharepoint. La configurazione avviene utilizzando il questi due URL:

  • https://URL_SITO_SHAREPOINT/_layouts/15/AppRegNew.aspx
  • https://URL_SITO_SHAREPOINT/_layouts/15/AppInv.aspx

Il primo link consente di effetture la registrazione dell’applicazione, generando in pratica il ClientId ed il ClientSecret. Il secondo link consente di configurare gli accessi che l’applicazione dovrà avere rispetto a sharepoint (es. lettura delle liste, scrittura sulle liste ecc…). La configurazione dei permessi si effettuata tramite XML: la spiegazione di come scrivere le rules è disponibili a questo link. Il sistema di permessi consente di effettuare una configurazione molto precisa: il consiglio è quello di effettuare la configurazione impostando solo i permessi strettamente necessari.

Si parte con la registrazione delle webapi utilizzando /_layouts/15/AppRegNew.aspx :

Risultato immagini per /_layouts/15/AppRegNew.aspx

Nota importante: impostare App Domain e Redirect URI con i valori corretti dell’end-point delle Api. Al termine annotarsi il valore di ClientId e ClientSecret generati.

Si procede quindi con l’autorizzazione per l’api appena generata, usando il link /_layouts/15/AppInv.aspx :

e ricercando tramite AppId l’applicazione registrata al passo precedente. I permessi di accesso a sharepoint vengono definiti all’interno di App’s Permission Request Xml. Ad esempio, per poter accedere con permission FullControl alle liste, impostare:

<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl"/>
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl"/>
</AppPermissionRequests>

Ovviamente, questo tipo di permesso è consigliato soltanto in ambiente dev e non in quello di produzione. Terminata la registrazione, è necessario confermare l’avvenuta configurazione:

A questo punto, lato Sharepoint è tutto configurato correttamente per consentire l’accesso remoto tramite ClientId e ClientSecret.

Si passa quindi alla parte della WebApi. Tecnicamente quello di cui abbiamo bisogno è il rilascio del token di accesso da parte di sharepoint e successivamente dell’esecuzione dell’operazione remota. Come già detto in precedenza, le interrogazioni avverrano tramite CAML query.

Tramite il Toolkit Web di Sharepoint possiamo scrivere i dati di accesso direttamente all’interno del file web.config, nella sezione appSettings:

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="ClientId" value="XXXXXX"/>
    <add key="ClientSecret" value="YYYYYY"/>
    <add key="WebUri" value="ZZZZZZ"/>
    <add key="ListTitle" value="Locations"/>
  </appSettings>

Nell’esempio è stata aggiunta anche una entry per la WebUri del portale Sharepoint da contattare, e di una lista da cui effettuare le operazioni tramite CAML.

A questo punto tutto è configurato per poter eseguire la chiamata. Modifichiamo il codice della webapi predefinita di .NET che risponde a /api/values in questo modo:

public IEnumerable<SimpleReturnClass> Get()
  {
		var webUri = new Uri(ConfigurationManager.AppSettings["WebUri"]);
		var listName = ConfigurationManager.AppSettings["ListTitle"];
		var realm = TokenHelper.GetRealmFromTargetUrl(webUri);
		var accessToken = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, webUri.Authority, realm).AccessToken;
		var context = TokenHelper.GetClientContextWithAccessToken(webUri.ToString(), accessToken);
		var dataList =  context.Web.Lists.GetByTitle(listName);
		var query = new CamlQuery();
		var dataFromSp = dataList.GetItems(query);
		context.Load(dataFromSp);
		context.ExecuteQuery();
		return dataFromSp.Select(singleLoc => new SimpleReturnClass() {Title = singleLoc["Title"].ToString()}).ToList();
   }

In questo caso viene generata una Caml Query vuota, che corrisponde ad ottenere tutto il contenuto della lista.

Questo è soltanto uno dei metodi possibile per poter effettuare l’esposizione del contenuto delle liste di sharepoint (o di una combinazione dei loro dati), tramite webapi esterne. Questa soluzione dovrebbe essere utilizzata quando non si ha la possibilità di utilizzare altro già esistente all’interno di azure, come Azure Logic Apps, Functions e Flow.