Nello scorso articolo abbiamo trattato in dettaglio la gestione della Membership in ASP.NET 2.0. La Membership è un API per la gestione degli utenti all'interno di un'applicazione .NET che, con pochissimo sforzo da parte degli sviluppatori, permette la memorizzazione degli utenti per l'autenticazione o altro. Come nel caso di quasi tutte le API all'interno del Framework 2.0, la configurazione di Membership avviene grazie ai provider. Semplificando l'argomento, i provider sono classi che permettono determinate operazioni e che hanno in comune proprietà e funzioni per determinati scopi. Nel caso della Membership vengono forniti due provider: uno per SQL Server (utilizzabile anche con SQL Server Express Edition) e uno per l'Active Directory. Rilasciato dalla stessa Microsoft, è disponibile come pacchetto separato anche il provider specifico per Access.
La programmazione a "provider" permette la modifica anche radicale di un aspetto di una web application senza dover mettere mano al codice. Ritornando ai provider già forniti direttamente da Microsoft, ipotizziamo di avere una web application che giri in hosting e che per l'accesso a determinate aree del sito necessiti dell'autenticazione dei vari utenti. Avendo a disposizione SQL Server, possiamo utilizzare questo potente DBMS relazionale per memorizzare gli utenti grazie alla Membership API. Nel caso ci trovassimo però nella condizione di dover spostare il nostro sito su un altro server e non avessimo più a disposizione SQL Server, ma, per esempio, solo Access, sarebbe sufficiente cambiare unicamente il Membership Provider utilizzato, limitando le modifiche ad una linea di configurazione nell'ambito del web.config.
Analisi del problema
Ipotizziamo di dover realizzare un sito distribuito su due server distinti, per il quale sia necessario condividere l'utenza in modo tale che gli utenti si possano registrare e autenticare in entrambe le applicazioni web.
Il problema, come mostrato nello schema in figura, è rappresentato dall'interscambio di informazioni tra i due server. Una delle soluzioni possibili è quella di creare su entrambi i server il database degli utenti prevedendo aggiornamenti incrociati. Una soluzione più semplice è invece quella di mantenere il database con tutta l'utenza su un solo server in modo che il secondo server possa creare e verificare gli utenti utilizzando un web service. Questa seconda soluzione comporta in ogni caso alcune modifiche per entrambe le applicazioni. La prima applicazione deve infatti esporre un web service per la modifica e la lettura del database degli utenti, mentre la seconda deve rivoluzionare in modo significativo il sistema di autenticazione per prevedere l'uso del web service.
Esiste una soluzione ancora più semplice, che comporta modifiche al codice minime grazie all'uso dei provider: possiamo infatti gestire l'applicazione per la gestione dell'utenza con l'API Membership. Dobbiamo innanzitutto creare un web service tramite cui fare le interrogazioni al database, quindi dobbiamo scrivere un provider per la gestione della Membership che sfrutta il web service sul primo server. Non occorrono altre modifiche. Vediamo in dettaglio i passi da seguire.
L'esempio
L'applicativo (che è anche allegato all'articolo) è una banale applicazione web che prevede la creazione di nuovi utenti e il login per l'accesso ad una sezione protetta.
Per il login e la creazione di utenti utilizziamo i Security Server Control. La memorizzazione degli utenti avviene su un database SQL Server contenuto in un file MDF grazie alla versione Express. Il codice relativo a questa parte è già stato trattato in modo approfondito nell'articolo precedente a cui si rimanda per eventuali approfondimenti.
A questo punto creiamo il web service (ValidateUser.asmx) riportato di seguito.
<%@ WebService Language="C#" Class="Validate" %> using System.Web; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Security; [WebService(Namespace = "http://azMembership.az/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Validate : System.Web.Services.WebService { [WebMethod] public bool ValidateUser(string user_name, string password) { return Membership.ValidateUser(user_name, password); } [WebMethod] public bool CreateUser(string username, string password, string email) { try { MembershipUser u = Membership.CreateUser(username, password, email); return true; } catch { return false; } } }
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.