Membership e Profile API con ASP.NET AJAX

di Stefano Mostarda, in ASP.NET 2.0,

Una delle grandi novità di ASP.NET 2.0 è stata l'introduzione delle Membership e Profile API che permettono una completa gestione delle informazioni relative agli utenti di un'applicazione. Grazie ad ASP.NET AJAX alcune delle funzionalità di queste API sono state rese disponibili anche in ambito client. In questo articolo viene illustrato come poter accedere ed utilizzare al meglio queste feature.

Membership API

Le Membership API ricoprono le esigenze di gestione delle utenze di un'applicazione. Tramite queste API si possono aggiungere, aggiornare, eliminare e visualizzare utenti con un sforzo praticamente minimo.

Analizzando l'ObjectModel tramite Reflector, si nota che ASP.NET AJAX ha una classe AuhenticationService, nel namespace System.Web.Security. Questa classe altro non è che il CodeBehind di uno Script Service (una tipologia speciale di Web Service che espone i propri metodi esclusivamente ad ASP.NET AJAX) che pubblica due metodi per permettere il login ed il logout dell'utente. La limitazione di questo servizio è proprio il fatto di pubblicare solo un subset delle Membership API e non tutte le funzionalità offerte normalmente lato server.

Il primo passo da compiere per utilizzare il servizio di autenticazione è abilitare il servizio stesso nel web.config. Quando si crea un nuovo sito web "AJAX-Enabled" da Visual Studio 2005, viene creato in automatico un web.config con tutti i settaggi necessari al funzionamento base di ASP.NET AJAX. In particolare, viene creata una sezione per specificare i parametri per il servizio di autenticazione:

<sectionGroup name="webServices"
  type="System.Web.Configuration.ScriptingWebServicesSectionGroup,
  System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
  PublicKeyToken=31bf3856ad364e35">
  <section name="authenticationService"
    type="System.Web.Configuration.ScriptingAuthenticationServiceSection,
    System.Web.Extensions, Version=1.0.61025.0,
    Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>

Una volta dichiarata la sezione, si passa alla sua definizione all'interno del nodo system.web.extensions:

<system.web.extensions>
  <scripting>
    <webServices>
      <authenticationService enabled="true" requireSSL="false" />
    </webServices>
  </scripting>
</system.web.extensions>

La sezione relativa al servizio è molto semplice in quanto contiene solo due proprietà:

  • enabled: specifica se il servizio è abilitato o meno (se il servizio è disabilitato, qualunque tentativo di invocazione da parte del client provoca un rifiuto da parte del server e conseguente errore);
  • requireSSL: specifica se per invocare il servizio si debba essere su una connessione protetta o meno. Nel caso in cui il valore di questa proprietà sia impostato a true e la pagina sia su una connessione non protetta, l'invocazione sul server non viene eseguita per evitare di inviare dati in chiaro laddove sia richiesta la protezione tramite SSL.

A questo punto la configurazione del servizio è finita, ma rimane da configurare l'applicazione per sfruttare la Forms Authentication ed impostare le autorizzazioni sui vari file e cartelle. Questo compito viene gestito tramite le classiche sezioni del web.config senza dover aggiungere nulla per quanto riguarda ASP.NET AJAX.

Adesso non rimane che passare alla stesura del codice necessario al login dell'utente. Poichè il Web Service è già presente in ASP.NET AJAX ed è stato pubblicato tramite configurazione, l'unica parte da coinvolgere è quella client utilizzando javascript.

I metodi a disposizione sono login e logout, mentre per sapere in qualunque momento lo stato dell'utente si può ricorrere alla proprietà get_isLoggedIn. Il proxy per il servizio di autenticazione non viene generato automaticamente dallo ScriptManager, ma è direttamente presente nella libreria così da eliminare i tempi di generazione e download del codice client relativo. La classe javascript che espone i metodi da utilizzare è Sys.Services.AuthenticationService ed utilizza i metodi descritti in precedenza in modalità statica.

Il metodo login prevede una firma molto ricca di parametri che possono essere molto utili.

Sys.Services.AuthenticationService.login(userName, password, isPersistent, redirectUrl, customInfo, loginCompletedCallback, loginFailedCallback, contextInfo);

Nell'ordine i parametri rappresentano:

  • userName: il nome dell'utente;
  • password: la password dell'utente;
  • isPersistent: un valore booleano che indica se il login deve essere persitente (cioè il cookie utilizzato per l'autenticazione deve sopravvivere quando viene chiuso il browser) o meno;
  • redirectUrl: un URL a qui reindirizzare l'utente dopo che il login è stato effettuato con successo. Se non viene specificato alcun valore, il browser non effettua nessun reindirizzamento;
  • customInfo: per ora questo valore non viene utilizzato, ma rimane come segnaposto per usi futuri da parte della Microsoft;
  • loginCompletedCallback: indica il nome della funzione che deve essere invocata quando l'autenticazione viene completata (sia in caso di successo che di fallimento);
  • loginFailedCallback: indica il nome della funzione da invocare nel caso si verifichi un'eccezione sul server;
  • contextInfo: contiene un valore che viene passato alla funzione di callback.

Alla luce di quanto detto, il seguente esempio mostra il codice utile all'autenticazione di un utente:

Sys.Services.AuthenticationService.login($get("txtUserName").value, $get("txtPassword").value, false, null, null, OnAuthenticationComplete, OnAuthenticationFailed, null);

Ciò che si ottiene da questa chiamata è che il metodo di autenticazione viene invocato passando il valore dei campi txtUserName e txtPassword per il riconoscimento, il cookie eventualmente creato non è persistente, non c'è redirect ad una pagina in caso di successo e le funzioni di callback in caso di completamento normale o con eccezione sono rispettivamente OnAuthenticationComplete e OnAuthenticationFailed. Infine, nessun valore aggiuntivo viene passato alla funzione di callback di ritorno.

La funzione di callback invocata nel caso di conclusione normale delle operazioni ha una firma con tre parametri:

  • validCredentials: contiene un valore booleano che indica se le credenziali sono state validate o meno;
  • userContext: riporta il valore del parametro contextInfo utilizzato per il login;
  • methodName: indica il nome del metodo javascript che ha chiamato il login.

function OnAuthenticationComplete(validCredentials, userContext, methodName) {
  if(validCredentials) {
    alert("Login effettuato con successo");
  }
  else {
    alert("Credenziali non valide");
  }
}

In caso di eccezioni durante l'autenticazione viene invocato un'altra funzione di callback che presenta una firma molto simile alla precedente:

  • errorObject: rappresenta un oggetto che contiene informazioni sull'errore che si è verificato sul server;
  • userContext: riporta il valore del parametro contextInfo utilizzato per il login;
  • methodName: indica il nome del metodo javascript che ha chiamato il login.

function OnAuthenticationFailed(errorObject, userContext, methodName) {
  alert("Autenticazione fallita. L'errore è stato: " + errorObject.get_message());
}

Il logout è un'operazione infinitamente più semplice rispetto al login, in quanto non occorre fornire credenziali di alcun tipo:

Sys.Services.AuthenticationService.logout(redirectUrl, logoutCompletedCallback, logoutFailedCallback, contextInfo);

Nell'ordine i parametri rappresentano:

  • redirectUrl: un URL a cui reindirizzare l'utente dopo che il logout è stato effettuato con successo. Se non viene specificato alcun valore, il browser effettua un reindirizzamento alla pagina di login definita nel web.config;
  • logoutCompletedCallback: indica il nome della funzione che deve essere invocata quando il logout viene completato (sia in caso di successo che di fallimento);
  • logoutFailedCallback: indica il nome della funzione da invocare nel caso si verifichi un'eccezione sul server;
  • contextInfo: contiene un valore che viene passato alla funzione di callback di ritorno.

Il codice riportato nell'esempio seguente esegue semplicemente il logout disinteressandosi del risultato dell'operazione.

Sys.Services.AuthenticationService.logout(null, null, null, null);

Non meno utile dei due metodi appena visti è la proprietà get_isLoggedIn che indica se l'utente è autenticato o meno. Peraltro questa proprietà può trarre in inganno in quanto viene impostata a true solo a seguito di un login sulla stessa pagina. Questo significa che se si effettua il login su una pagina, e poi si naviga su un'altra, il valore di questa proprietà è settato su false.

2 pagine in totale: 1 2
Contenuti dell'articolo

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