Usare ASP.NET Identity con Microsft Azure DocumentDB

di Moreno Gentili, in ASP.NET Identity,

Se ASP.NET Identity è in grado di sorpassare i tradizionali sistemi di membership, è grazie anche alla libertà che concede allo sviluppatore nel progettare il suo sistema di archiviazione degli utenti. Per mezzo di interfacce come IUserStore, il Core di ASP.NET Identity è solo debolmente accoppiato allo strato di persistenza dei dati e perciò non dipende da alcuna implementazione specifica.

Visual Studio 2013, nell'introdurci ad ASP.NET Identity, ci presenta un template di progetto in cui la persistenza degli utenti è affidata ad Entity Framework. Tuttavia, ci sono situazioni in cui la nostra applicazione ASP.NET si trova a lavorare con dati non strutturati. In questo caso potremmo scegliere di sostitutire il tradizionale database relazionale con un database schema-less come DocumentDB, offerto da Microsoft Azure come servizio di archiviazione nel cloud. Cristian Civera ci ha già introdotti con un suo ottimo articolo http://www.windowsazureitalia.com/articoli/windows-azure/introduzione-documentdb-azure.aspx alla scalabilità e alle prestazioni di DocumentDB. Una lettura sicuramente consigliata per essere informati e per saper affrontare, in futuro, la scelta tra database relazionali e database cosiddetti "NoSQL".

Grazie ad ASP.NET Identity, sostituire Entity Framework con DocumentDB è un'operazione veramente semplice e rapida.

Creiamo una nuova applicazione web ASP.NET MVC 5 dal relativo template di progetto di Visual Studio 2013. Iniziamo disinstallando Entity Framework con il seguente comando dalla console di gestione pacchetti:

Uninstall-Package Microsoft.AspNet.Identity.EntityFramework.it -RemoveDependencies

Rimuoviamo anche ogni eventuale direttiva using Microsoft.AspNet.Identity.EntityFramework; dai file di codice del progetto.

Da NuGet, otteniamo il pacchetto di DocumentDB per ASP.NET Identity. Nell'installarlo, usiamo il parametro -Pre dato che si tratta di un pacchetto disponibile in versione pre-release.

Install-Package DocumentDB.AspNet.Identity -Pre

A questo punto, non ci resta che intervenire sul codice affinché ASP.NET Identity inizi ad usare questo nuovo meccanismo di persistenza.

  • Nel file Models/IdentityModels.cs, facciamo in modo che il nostro ApplicationUser derivi da DocumentDB.AspNet.Identity.IdentityUser (è sufficiente aggiungere una direttiva using);
  • Dallo stesso file, eliminiamo completamente la classe ApplicationDbContext, ora inutilizzata.
    Inoltre, dal file App_Start/Startup.Auth.cs, eliminiamo anche l'istruzione in cui l'ApplicationDbContext veniva creato e aggiunto al contesto Owin.

    //Eliminiamo questa riga da App_Start/Startup.Auth.cs
    
    //app.CreatePerOwinContext(ApplicationDbContext.Create);

  • Nel file App_Start/IdentityConfig.cs andiamo a modificare la costruzione dell'ApplicationUserManager, la nostra principale API di accesso agli utenti. Dal suo metodo statico Create, sostituiamo la prima riga per fornirgli un'istanza del nuovo UserStore.

    //Eliminiamo la prima riga del metodo Create
    
    //var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    
    //E aggiungiamo la riga seguente. Per istanziare lo UserStore, dobbiamo conoscere l'indirizzo dell'endpoint di DocumentDB, la sua chiave di autorizzazione e ovviamente il nome del database
    
    var manager = new ApplicationUserManager(new DocumentDB.AspNet.Identity.UserStore<ApplicationUser>(new Uri(endpointAddress), authKey, dbName));

In ASP.NET Identity, lo UserStore è l'oggetto che si occupa di orchestrare l'accesso ai dati e perciò necessita delle informazioni di collegamento al nostro database DocumentDB. I tre valori richiesti sono endpointAddress, authKey e dbName, che possiamo ottenere dal nuovo portale di Microsoft Azure. Accediamo dunque a https://portal.azure.com e, nel caso non ne avessimo già uno, creiamo un nuovo database DocumentDB cliccando il tasto "Aggiungi".

Dopo qualche minuto, il nostro database sarà pronto all'uso. Accediamo alla sua blade di dettaglio per recuperare le informazioni richieste.

Copiamo le informazioni nel codice e lanciamo l'applicazione: possiamo sin da subito iniziare a registrarci e ad autenticarci. Lo UserStore per DocumentDB supporta molte delle funzionalità di ASP.NET Identity 2, come la gestione dei ruoli (ovviamente), il blocco dell'account, il sign-out everywhere e le autenticazioni basate su claims e a due fattori.

Ecco come si presenta un utente di ASP.NET Identity salvato nella collection "Users" del nostro database DocumentDB.

{
  "id": "451b3e53-fe6c-441e-0bfe-cb56912ed7da",
  "UserName": "email@example.com",
  "Email": "email@example.com",
  "EmailConfirmed": false,
  "PasswordHash": "EFE44RzqaFE/g14Q0svLBa1OgFE9S3mz0vcvp+x0dX/ETbkiiseG5z8w2k6A==",
  "SecurityStamp": "2e91ddad-1a26-4cd6-b640-ab7c8232d982",
  "PhoneNumber": "",
  "PhoneNumberConfirmed": false,
  "TwoFactorEnabled": false,
  "LockoutEnd":  "0001-01-01T01:00:00+01:00",
  "LockoutEnabled": true,
  "AccessFailedCount":  0,
  "Logins": [ { "LoginProvider": "Facebook", "ProviderKey": "296134420" } ],
  "Claims": [ { "ClaimType": "urn:facebook:access_token", "ClaimValue": "a73bf01e4c0443b" } ],
  "Roles": [ "Operatore", "Editore" ],
  "_rid": "ThpnAMiEWwABAAAAAAAAAA==",
  "_ts": 1422659291,
  "_self": "dbs/RmlnNA==/colls/VnpnBMiFWwO=/docs/ThpuAMiFWrABAAAAAAAAAA==/",
  "_etag": "00000a00-0000-0000-0000-62f30ced1000",
  "_attachments": "attachments/"
}

E' importante notare la differenza con la quale DocumentDB archivia i dati rispetto ad un database relazionale: non vengono generate righe su molteplici "tabelle" ma viene prodotto un unico documento serializzato in JSON che contiene ogni informazione dal grafo dell'utente, compresi i suoi ruoli, i login esterni e i claims. Se, da un lato, DocumentDB ci porta a lavorare con una base dati piuttosto denormalizzata, dall'altro ci offre prestazioni eccellenti per l'assenza di relazioni, specialmente in fase di lettura dati - l'operazione di gran lunga più ricorrente in una tipica applicazione web.

Per maggiori informazioni sull'uso DocumentDB, sulla documentazione tecnica e i prezzi, le pagine da consultare sono quelle del sito ufficiale di Microsoft Azure.
http://azure.microsoft.com/it-it/services/documentdb/

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi