Creazione di un Membership Provider personalizzato

3 pagine in totale: <<Indietro 1 2 [3]

Creazione del provider

Come abbiamo visto in precedenza, per specificare il provider per l'applicazione utilizziamo il web.config. Grazie ad esso il runtime sa quale classe utilizzare per la gestione della Membership (Dependency Injection). Nel caso del provider personalizzato AzMembershipProvider, è prima di tutto necessario ereditare la classe dal tipo System.Web.Security.MembershipProvider.

Ecco la prima parte della nostra classe.

namespace System.Web.Security
{
  using ...

  public class AzMembershipProvider : MembershipProvider
  {
    string _url;
    string _name;
    public override void Initialize(string name, NameValueCollection config)
    {
      if (config == null)
      {
        throw new ArgumentNullException("config");
      }
      if ((name == null) || (name.Length == 0))
      {
        name = "AzProvider";
      }
      _name = name;
      if (config["url"] == null)
        throw new ArgumentNullException("Missing 'url' parameter!");
      else
        _url = config["url"];
      base.Initialize(name, config);
    }

    ...

  }
}

Come detto, la classe AzMembershipProvider eredita dalla classe MembershipUser e opera un override del metodo Initialize della classe base e di tutte le funzioni di interesse. Nel nostro caso ci limitiamo ad inserire unicamente le funzioni per la creazione di un nuovo utente, per il controllo della sua esistenza più altre d'obbligo.

    public override bool ValidateUser(string name, string password)
    {
      try
      {
        localhost.Validate v = new localhost.Validate();
        return v.ValidateUser(name, password);
      }
      catch
      {
        return false;
      }
    }
    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
      localhost.Validate v = new localhost.Validate();
      if (v.CreateUser(username, password, email))
      {
        status = MembershipCreateStatus.Success;
        return new MembershipUser(
        _name, // provider name
        username, // nome utente
        "xxx", // provider user key
        email, // email
        passwordQuestion, // domanda
        string.Empty, // commento
        true, // abilitato
        false, // bloccato
        DateTime.MinValue, // data di creazione
        DateTime.MinValue, // data di login
        DateTime.MinValue, // data dell'ultima pagina visualizzata
        DateTime.MinValue, // data dell'ultimo cambio di password
        DateTime.MinValue); // data dell'ultimo blocco avvenuto per quell'utente
      }
      else
      {
        status = MembershipCreateStatus.UserRejected;
        return null;
      }
    }
    public override bool RequiresQuestionAndAnswer
    {
      get { return false; }
    }
    public override string Name
    {
      get { return _name; }
    }

Entrambi i metodi implementati richiamano il web service. Il metodo ValidateUser viene chiamato sul primo server per la verifica di username e password con il ritorno di un valore booleano (true: i dati sono corretti; false: i dati sono errati). Per CreateUser facciamo un passo indietro visto che, come detto in precedenza, non possiamo serializzare in SOAP la classe MembershipUser. Per questo motivo, dopo aver verificato che l'utente sia stato creato correttamente, istanziamo la classe MembershipUser specificando alcuni dati fittizi, dato che, per esempio, la data di creazione dell'account o la data del suo ultimo accesso nel nostro caso non ci interessano.

È bene ricordare che pressoché tutti i metodi di MembershipUser sono dichiarati come abstract. Per evitare errori di compilazione, facciamo l'override dei membri astratti con una implementazione fittizia, sollevando per ciascuno di essi l'eccezione NotImplementedException.

    public override bool EnablePasswordRetrieval
    {
      get { throw new global::System.NotImplementedException(); }
    }
    public override bool EnablePasswordReset
    {
      get { throw new global::System.NotImplementedException(); }
    }

E con questo abbiamo concluso... Le due applicazioni sono in grado di condividere i dati dell'utenza in modo trasparente e senza aver complicato il codice con personalizzazioni estreme.

Allegato

Gli esempi trattati in questo articolo sono disponibili nel file ZIP allegato. Il file in questione include le due applicazioni già configurate per il funzionamento corretto. E' sufficiente creare due directory virtuali in IIS di nome "mem1" e "mem2" e il gioco è fatto. Inizialmente non sono presenti utenti all'interno del database, ma è sufficiente crearne uno direttamente dalla pagina web e verificare che si possa autenticare da entrambe le applicazioni. Buon divertimento!

Conclusioni

Il modello dei provider è ampiamente utilizzato nella nuova versione del Framework. Il vantaggio nell'uso dei provider è la flessibilità ed estendibilità che è garantita dalla possibilità di iniettare le dipendenze tra i tipi a runtime, definendo nella configurazione quale tipologia di implementazione concreta utilizzare. Come abbiamo visto in questo articolo, questo discorso vale anche per la Membership: possiamo definire i nostri meccanismi di autenticazione custom e renderli intercambiabili tra loro.

3 pagine in totale: <<Indietro 1 2 [3]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC