Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

I Client Application Services di .NET 3.5

I Client Application Services di .NET 3.5
Data: 29/11/2007
Categoria: ASP.NET 3.5


Con l'arrivo di Visual Studio .NET 2008 tante sono state le novità aggiunte sia all'IDE che al framework sottostante. Una di queste, magari meno nota, per quanto riguarda lo sviluppo di applicazioni client, mi è piaciuta particolarmente. Si tratta dei "Client Application Services", tramite i quali è possibile configurare le proprie applicazioni Windows Form o WPF, in modo tale da utilizzare i servizi di autenticazione, gestione dei ruoli e gestione dei profili offerti dagli "Application Services" di ASP.NET 3.5, in modo tale da permettere a più applicazioni windows di condividere le medesime informazioni sui profili di autenticazione.
Il funzionamento dell'intero sistema è reso possibile grazie al modello esposto dalle applicazioni web ASP.NET 3.5 AJAX-enabled, interamente basato sui web service. Ogni applicazione client infatti, avrà all'interno dei propri settings tutti i riferimenti a tali web service e sarà così in grado di scambiarci le informazioni di cui ha bisogno. Questo approccio è un esempio lampante di applicazioni basate sulla scuola di pensiero SOA (Service-Oriented Architecture).
Attraverso questa novità, le operazioni che saranno in grado di compiere così le nostre applicazioni windows, saranno:
  • autenticazione di utenti, tramite username e password (sia mediante Windows Authentication che tramite la Forms Authentication).
  • Determinazione dei ruoli assegnati agli utenti che hanno completato con successo la procedura di autenticazione, in modo tale da abilitare o meno funzionalità aggiuntive all’applicazione in base ai ruoli ritornati.
  • Lettura e scrittura di settings personalizzati per ogni utente attraverso il meccanismo dei profili; così facendo lo sviluppatore sarà in grado di offrire agli utenti un'applicazione altamente personalizzabile.
I servizi di applicazione offerti dal runtime di ASP.NET 3.5, precisamente dall’estensioni di AJAX, vengono esposti in modo tale che non solo le pagine web .aspx possano accedervi, ma anche qualsiasi tipo di applicazione basata sul .NET Framework. Entrambi i tipi di client comunque, parlano con gli Application Services esposti, passandosi i pacchetti in formato JSON (acronimo di JavaScript Object Notation), formato che permette appunto lo scambio di informazioni tra sistemi client e server, passando su richieste Post del protocollo HTTP. Ogni richiesta viene fatta comunque in modalità sincrona.
La cosa veramente utile è che per accedere alle funzionalità offerte da questi servizi, basta utilizzare le medesime classi offerte dai vari provider di autenticazione, gestione di ruoli e profile di ASP.NET; se volessimo quindi controllare la username e la password inserite dall'utente in una finestra nella fase di avvio della nostra applicazione client, non dovremmo far altro che chiamare il metodo statico ValidateUser della classe Membership (del namespace System.Web.Security).


if (Membership.ValidateUser(txtUsername.Text, txtPassword.Password))
{
    MessageBox.Show("Utente connesso !");
}
else
{
    MessageBox.Show("Username e password non corretti !");
    Application.Current.Shutdown();
}

Allo stesso modo, possiamo avvelerci delle proprietà e dei metodi esposti della proprietà CurrentPrincipal della classe Thread per controllare se l'utente è veramente autenticato (proprietà IsAuthenticated), per recuperarne il nome (proprietà Identity.Name) e il tipo di autenticazione e per vedere se appartiene o meno ad un particolare gruppo (metodo IsInRole):


if (Membership.ValidateUser(txtUsername.Text, txtPassword.Password))
{
    MessageBox.Show("Utente connesso !");
    MessageBox.Show("Username: " + Thread.CurrentPrincipal.Identity.Name);
    if (Thread.CurrentPrincipal.IsInRole("Administrators"))
    {
        MessageBox.Show("Utente amministratore !");
    }
}
else
{
    MessageBox.Show("Username e password non corretti !");
    Application.Current.Shutdown();
}

Per effettuare il logut invece, dobbiamo chiudere l'applicazione client.

Abilitazione dei servizi

Per permettere però l'utilizzo delle classi sopra descritte, dobbiamo configurare l’applicazione windows in modo tale da poter dialogare con gli Application Services esposti da un'eventuale applicazione web ASP.NET 3.5; per farlo dobbiamo prima assicurarci che l'applicazione web abbia abilitati i servizi di cui abbiamo bisogno. Nel web.config dell'applicazione deve essere inserita perciò la sezione system.web.extension che specifica quali servizi sono abilitati e che quindi possono essere esposti:

<system.web.extensions>

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

Una volta che ci siamo assicurati che gli Application Services dell'applicazione web, di cui abbiamo bisogno, siano abilitati, dobbiamo configurare la nostra applicazione client windows andando sulle proprietà del progetto e scegliendo il tab "Services". All'interno della finestra di configurazione sarà possibile così scegliere il tipo di autenticazione da utilizzare (Forms o Windows) e, nel caso di utilizzo dell'autenticazione Forms, i riferimenti ai vari servizi esposti.
In figura, potete vedere la configurazione del servizio di autenticazione, offerto dall'applicazione web ASP.NET raggiungibile all’indirizzo http://localhost:51322/AjaxEnabledWebSite.

Client Application Service configuration in Visual Studio .NET 2008

Tutte le configurazioni aggiunte all'interno del tab "Services" della finestra delle proprietà della nostra applicazione windows, una volta salvate, verranno automaticamente riportate dall'IDE all'interno del file App.config come segue:

<system.web>

<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider"
type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"

serviceUri="http://localhost:51322/AjaxEnabledWebSite/Authentication_JSON_AppService.axd"
/>
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider"
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"

serviceUri="http://localhost:51322/AjaxEnabledWebSite/Role_JSON_AppService.axd"
cacheTimeout="86400"
/>
</providers>
</roleManager>
</system.web>

Come nella configurazione dei provider di ASP.NET introdotti nella versione 2.0, anche nel file di configurazione della nostra applicazione client, avremo quindi le sezioni <membership /> e <rolemanager />, che rispettivamente puntano ognuno al relativo Application Service esposto dall'applicazione web; applicazione di cui si ha il riferimento all'interno della proprietà "serviceUri".
Come potete notare, all'url dell'applicazione web che espone i servizi, sono stati aggiunti da Visual Studio .NET 2008 i nomi dei web service Authentication_JSON_AppService.axd e Role_JSON_AppService.axd rispettivamente per i servizi di autenticazione e gestione degli ruoli.

Conclusioni
Attraverso questa nuova tecnologia siamo in grado di creare un archivio di informazioni di autenticazione, ruoli e profili centralizzato, cui multiple applicazioni windows possono accedervi ed avvalersi dei servizi esposti. Questi servizi permettono di personalizzare le proprie applicazioni client mantenendo sempre in un'unica locazione le informazioni da condividere. Questo meccanismo risulta un esempio perfetto per quanto riguarda lo sviluppo di applicazioni Service-Oriented (SOA).

Link utili
Client Application Services
ASP.NET Application Services