La domanda può sembrare banale, ma come si fanno ad ottenere delle informazioni sull’utente (ad esempio lo userid) che si è appena autenticato usando l’IdP ?

La procedura è completamente eseguita per mezzo di chiamate all’SDK del client Azure o anche dell’SDK dell’IdP, e in nessun punto vi è la possibilità di accedere allo userid inserito dall’utente.

Solo usando la client-flow si ha in mano il token rilasciato dall'IdP, che eventualmente può essere utilizzato, sempre con l’ausilio dell’SDK fornito, per prelevare ulteriori informazioni sull’utente.

Questa operazione implica sempre chiamate a servizi esterni, nonchè conoscere molto bene l'SDK dell'IdP utilizzato.

Se invece si usa l'autenticazione server-flow è impossibile accedere al token originario e/o alle informazioni che l’IdP ha sul nostro utente (esempio: la mail).

Per ovviare a questo i servizi Azure Mobile mettono a disposizione un endpoint apposta che restituisce proprio questa informazione.
<URL backend>/.auth/me.

Più in dettaglio interrogando questo endpoint, aggiungendo alla richiesta il token rilasciato dai servizi Azure, verranno restituite le informazioni principali che l’IdP ha sul nostro utente, insieme anche al token originario rilasciato dell’IdP.

Nota molto importante.

Siccome in casi particolari un utente può essersi autenticato ai servizi Azure con l'ausilio di più Idp contemporanemante, usando questo endpoint si hanno indietro tutte le informazioni di tutti gli IdP associato all’utente. Per questo motivo la risposta è una List e non un oggetto singolo.

 

La chiamata per consultare questo endpoint è oggettivamente molto semplice.

 public async Task GetIdentityAsync()

{
  if (client.CurrentUser == null || client.CurrentUser?.MobileServiceAuthenticationToken == null)
  {
    throw new InvalidOperationException("Not Authenticated");
  }
  if (string.IsNullOrEmpty(Settings.UserId) )
  {
    var identities = await client.InvokeApiAsync<List>("/.auth/me");
    if (identities.Count > 0)
    {
      return identities[0].UserId;
    }
                    
  }

  return null;
}

 Una cosa analoga può essere fatta anche lato backend.

 

public async Task<IHttpActionResult> PostFocaccePost(FocaccePost item)
{
	var identity = await User.GetAppServiceIdentityAsync<FacebookCredentials>(Request);
	if (identity !=null)
	{
		item.NomeUtente=identity.UserId;
	}
FocaccePost current = await InsertAsync(item); return CreatedAtRoute("Tables", new { id = current.Id }, current); }

In particolare il codice sopra permette di evitare all'utilizzatore di mettere la proprio UserId: questa viene forzata lato server basandosi sul'autenticazione utente.

Desidero osservare che sempre lato server avendo la possibilità di conoscere il nome utente di chi sta usando il servizio è possibile introdurre anche l'autorizzazione, quindi permettere a certi utenti di accedere ai metodi di certi controller e ad altri impedirne l'utilizzo.

Questo era l'ultimo post di questa serie dedicata al mondo Xamarin e i servizi Azure Mobile. Ci sarebbe molto di più da dire e approfondire, ma direi che quanto esposto e più che sufficiente per permetterVi di addentrarVi nell'argomento.

Spero che la serie Vi sia piaciuta: se così non è Vi consiglio di consolarVi per il tempo perso gustando della vera focaccia genovese (ma che sia autentica) !

 

Linkografia

Git Page: Focac-Book in Xamarin