Professional Documents
Culture Documents
Scrivi a
Building Scalable ASP.NET 2.0 Unleashed
Web Sites book@infomedia.it di S. Walther
di C. Henderson specificando
nell’oggetto della
O’ Reilly e-mail: Sams
ISBN 0596102356 ISBN 0672328232
348 pp - 39,99 € IN OFFERTA 1992 pp + CD - 52,95 €
VBJ n. 70
OPPURE
inviaci il coupon
Oracle HTML DB Windows Forms 2.0
Application Express sottostante Programming
di L. Linnemeyer e B.D. al numero di fax di C. Sells
Brown
0587/732232 Addison Wesley
ISBN 0321267966
Potrai acquistare 1292 pp - 52,95 €
Mc Graw Hill
ISBN 883864456X
i libri qui riportati con
540 pp - 43,00 € uno
SCONTO
CSS Mastery: Advanced
ECCEZIONALE Agile Software
Web Standards Solutions Construction
di A. Budd del 10% anche se di J. Hunt
acquisti solo un
libro Springer
Friends of ED ISBN 1852339446
ISBN 1590596145 OPPURE 254 pp - 65,47 €
280 pp - 43,70 €
del 20% se acquisti
3 libri
VBJ 70
online.infomedia.it
n. 70 - luglio/agosto 2006
bimestrale - anno dodicesimo
Direttore Responsabile
Marialetizia Mari (mmari@infomedia.it)
Direttore Esecutivo
ED I T O R I A L E
Il significato di
Francesco Balena (fbalena@infomedia.it)
Managing Editor
Renzo Boni (rboni@infomedia.it)
Collaboratori
“open source”
Raffaele Di Natale
Andrea Ferendeles
Fabio Perrone
Paolo Pialorsi
Gian Maria Ricci
O ggi ho partecipato a una riunione il cui scopo era decidere quali tecnologie utilizzare
per un applicativo di grandi dimensioni per la pubblica amministrazione. Come
spesso accade in questi casi, si era formato quasi naturalmente un
Justyn Roberts gruppo di dotnettiani e uno di javisti. In realtà l’accento non era
tanto sui linguaggi ma sulla filosofia di fondo, quindi chiamerò
questi ultimi gli opensourciani. Anche se è facile immaginare in
quale gruppo mi trovavo io, devo dire che il confronto è stato
costruttivo e mi ha permesso di imparare alcune cose che non
conoscevo.
La conclusione più interessante, però, non è stato tanto pesare
le ragioni dei due gruppi, quanto constatare quanto soggettiva
Direzione sia la definizione di open source, sia tra i suoi sostenitori che tra
Natale Fino (nfino@infomedia.it) i detrattori. C’è chi utilizza questo termine come sinonimo di gratuito, chi per indicare
Marketing & Advertising che i programmi open source sono forniti in sorgente, altri ancora per indicare che i fra-
Segreteria: 0587/736460 mework stessi sono disponibili in sorgente, chi sostiene che i linguaggi open source sono
marketing@infomedia.it
standard e non proprietari, e che sono supportati da una grande comunità di appassionati
Amministrazione che hanno sviluppato centinaia di componenti gratuite per tutti i gusti.
Sara Mattei Tutto vero. Peccato che anche il .NET Framework sia gratuito e fornito per il 90% in
(amministrazione@infomedia.it)
sorgente (con l’iniziativa SSCLI), che il C# sia uno standard ECMA, e che anche per .NET
Grafica esista una vastissima community che ha prodotto dei piccoli capolavori. Quanto al fatto di
(grafica@gruppoinfomedia.it)
fornire i sorgenti con le proprie applicazioni, quella ovviamente è una scelta degli svilup-
Technical Book patori (o è un vincolo contrattuale, come accade spesso con la pubblica amministrazione)
Lisa Vanni (book@infomedia.it) che è ovviamente utilizzabile anche con il software .NET (o Delphi, o VB6, ecc.)
Segreteria Nei fatti, non è affatto semplice definire cosa significhi realmente open source, soprat-
Enrica Nassi tutto se prendiamo in esame le numerose varianti di licenza disponibili in quel mondo.
(info@infomedia.it)
Le cose vanno persino peggio se si considerano le altre componenti che compongono una
tipica applicazione, ad esempio il database o i server applicativi. Incredibilmente, a volte
Stampa mi tocca spiegare che il database Oracle non è affatto gratuito (anzi!), anche se gira su
TIPOLITOGRAFIA PETRUZZI un sistema open source, come del resto non lo è neanche MySql nelle configurazioni in
Citta’ di Castello (PG) cluster. E viceversa, devo chiarire che Microsoft SQL Server Express non solo è gratuito
ma permette anche una migrazione assolutamente indolore verso il SQL Server “vero”
Ufficio Abbonamenti quando occorrono migliori prestazioni e scalabilità.
Tel. 0587/736460 - Fax 0587/732232
Non voglio essere frainteso. Io sono convinto che il movimento open source ha fatto
e-mail: abbonamenti@infomedia.it
www.infomedia.it molto e continuerà a fare moltissimo per il mondo IT. Ad esempio, ha fornito software ai
paesi del terzo e quarto mondo, dove una licenza di Windows Server 2003 costa quanto
Gruppo Editoriale Infomedia srl
Via Valdera P., 116 - 56038 Ponsacco (PI) Italia
lo stipendio annuale di un impiegato, e ha reso possibile la costruzione di computer da
Tel. 0587/736460 - Fax 0587/732232 100$ che contribuiranno in modo determinante alla crescita culturale ed economica di
red_vbj@infomedia.it quei paesi.
Sito Web www.infomedia.it
Ma se davvero vogliamo fare un discorso economico (e non ideologico), dovremmo
considerare il Total Cost of Ownership (TCO): una macchina Linux costa meno di un equi-
valente sistema Windows, ma la sua installazione e amministrazione richiede esperienze
ben più vaste di quelle in possesso di un impiegato “medio” di una azienda “media”. In un
mondo dove la manodopera (soprattutto se qualificata) costa tanto, risparmiare sul costo
Manoscritti e foto originali anche se non pubblicati, del software è davvero un buon affare come sembra?
non si restituiscono. È vietata la riproduzione
anche parziale di testi e immagini.
Francesco Balena www.dotnet2themax.it/blogs
Si prega di inviare i comunicati stampa e gli inviti stampa per
la redazione all’indirizzo: comunicatistampa@infomedia.it
Visual Basic Journal è una rivista di
Gruppo Editoriale Infomedia S.r.l. Via Valdera P, 116 Ponsacco - Pisa.
Registrazione presso il Tribunale di Pisa n. 20/1999
N. 70 - Luglio/Agosto 2006 VBJ 7
SOMMARIO
L U G L I O / A G O S TO
N.70 Editoriale
RUBRICHE
7
.NET Tools 61
SPECIALE
Windows Workflow Foundation 11
I componenti chiave di WinFX, la prossima versione di API managed per Windows
di Paolo Pialorsi
TECNICHE
CAPermutations: una libreria per risolvere problemi 19
combinatori
Regine, amazzoni e un'introduzione ai problemi combinatori.
di Francesco Balena
APPLICATIVI
.NET Sql Authorization Manager (NetSqlAzMan)
Un gestore di applicazioni sviluppate con il .NET Framework 2.0 27
di Andrea Ferendeles
C#
Generics in C# 2.0 45
L’introduzione della programmazione generica è sicuramente la novità più interessante del .NET 2.0, scopriamone
le caratteristiche principali.
di Gian Maria Ricci
MOBILE
Common Time mSuite Security 52
La programmazione orientata ai template enfatizza il riuso non solo dei componenti, ma anche delle loro modalità di utilizzo
di Lorenzo Vandoni
C
ontinuiamo la serie di articoli dedica- quando scriviamo il codice delle
ti all’introduzione di WinFX, di recente nostre applicazioni, definiamo
rinominato .NET 3.0 da parte di Micro- dei flussi operativi/funzionali
soft. Come abbiamo già visto nel primo articolo che sono assimilabili a dei work-
di questa serie [1], .NET 3.0 è la prossima ver- flow. Pensiamo a tutti quei casi
sione di API managed per Windows, cioè basa- in cui farciamo il nostro codice
te sul .NET Framework di Microsoft, che vedrà di costrutti If, While, chiamate
la luce insieme a Windows Vista, ma che funzio- a metodi, a servizi esterni, ecc.
nerà anche su Windows XP Service Pack 2 e su in funzione dei requisiti funzio-
Windows Server 2003. nali che ci vengono indicati dal
In questo appuntamento concentriamo la nostra progetto in fase di sviluppo. In
attenzione su Windows Workflow Foundation realtà alle spalle di quel codice
(WF), il motore di workflow pensato per gestire, vi sono ragionamenti, diagram-
creare e descrivere flussi applicativi e processi mi di flusso e processi :in una
di business. parola, appunto, il “progetto”.
Spesso il problema che deriva
Perché WF dalla definizione di un proces-
so sotto forma di codice è il fatto
Il concetto di workflow in quanto tale è general- che quello stesso codice, rivisto
mente noto come flusso operativo/funzionale che magari anche solo alcuni mesi
descrive e controlla un processo di business, secon- dopo, se non è opportunamen-
do regole e percorsi definiti da un esperto del do- te commentato e documentato
minio di applicazione. Praticamente ogni giorno, diventa estremamente criptico.
Inoltre a volte il codice che gesti-
sce i flussi funzionali è annega-
to nel codice che gestisce l’inter-
Paolo Pialorsi, è un consulente e autore specializzato nello
sviluppo di servizi SOA e soluzioni in architettura distribuita faccia utente. Pensiamo ad una
basate sul Framework .NET di Microsoft. Lavora nell’omonima form nella quale un pulsante o
società Pialorsi Sistemi S.r.l. e fa parte del gruppo DevLeap. Può una textbox devono essere atti-
essere contattato via email: paolo@devleap.it. Mantiene il blog
personale all’indirizzo http://blogs.devleap.com/paolo/.
vati solo se l’utente sceglie una
determinata altra opzione, sem-
WinFx è un insieme di
librerie managed, per la
gestione delle applicazioni
del domani
Figura 1 Architettura di Windows Workflow
Foundadtion
stione dello stato, tracking, comunicazione da una classe base definita del framework di
con l’esterno, ecc. classi di WF e che si chiama System.Workflo
w.ComponentModel.Activity.
Tipologie di Workflow in WF
In Workflow Foundation sono definibili due
tipologie di Workflow: Sequential Workflow e
State Machine Workflow.
vizi infrastrutturali al contorno del motore di per lavorare con i dati, per gestire scambi di
WF. Ad esempio se abbiamo l’esigenza di per- record da una sorgente ad una destinazione.
sistere lo stato di un Workflow tra un’Activi- SSIS e BizTalk poi sono vere e proprie appli-
ty e l’altra, pensiamo ad una DelayActivity cazioni o servizi, che sono eseguite in un loro
o all’attesa di un evento, possiamo utilizzare contesto. WF invece è eseguibile all’interno
un WorkflowPersistenceService che si occu- di altre applicazioni, anche e principalmen-
perà di gestire il salvataggio dello stato del te nostre, per consentire a noi di descrivere i
flusso. In WF esiste già un SqlWorkflowPer- flussi operativi dei nostri processi.
sistenceService nativo, che salva lo stato in
SQL Server, per aumentare la scalabilità delle Microsoft .NET 3.0 ad oggi è in versione Beta
nostre soluzioni. Se invece dobbiamo traccia- 2 e l’ultima build disponibile alla data in cui
re i flussi, possiamo utilizzare un Tracking- scrivo questo articolo è di Maggio 2006. Ben-
Service, come ad esempio il SqlTrackingSer- ché in beta è però scaricabile dal sito di Mi-
vice. In generale esistono diversi servizi al crosoft [2] dedicato all’argomento. Inoltre sia
contorno e possiamo crearne anche di nostri, WCF che WF sono in versione GoLive, cioè
con l’obiettivo di supportare e arricchire il fra- possiamo utilizzarli in applicazioni reali, oltre
mework di base. che per ricerca e sviluppo interno. Consiglio
quindi di scaricare l’ultima build di .NET 3.0
e iniziare a valutare questo nuovo e interes-
sante framework che in parte rivoluzionerà il
La persistenza dello stato modo di scrivere le nostre applicazioni. È an-
dei Workflow è garantita che utile fare riferimento al sito specifico di
WF [3] per scaricare esempi, activity custom
da servizi personalizzabili e trovare contenuti di vario genere, utili ad
del WorkflowRuntime inquadrare meglio questa tecnologia.
Riferimenti
[1] Paolo Pialorsi – “WinFx: Windows
Communication Foundation”, VBJ n° 69
Conclusioni [2] http://www.netfx3.com/
Un quesito abbastanza diffuso, quando si [3] http://wf.netfx3.com/
parla di WF, è che in realtà, almeno in appa- [4] http://www.devleap.com/winfx/
renza, in casa Microsoft vi sono già servizi che
potrebbero sembrare potenziali concorrenti di
WF, come BizTalk Server e SQL Server Inte-
gration Services (SSIS). In realtà è sbagliato
pensarli come concorrenti di WF. BizTalk Ser-
ver è un servizio server pensato per gestire
soluzioni principalmente message oriented,
orientate all’integrazione tra applicazioni e si-
stemi gestionali/ERP e informativi in genere.
BizTalk descrive nell’Orchestration Designer
dei flussi sequenziali, infatti nella sua prossi-
ma versione dovrebbe appoggiarsi a WF per
farlo, ma questa è solo una minima parte del
lavoro che un BizTalk server può svolgere.
Anche SSIS non è un concorrente di WF, né
tantomeno di BizTalk, infatti SSIS è pensato
CAPermutations:
una libreria per
risolvere problemi
combinatori di Francesco Balena
Permutazioni
classe, Permutations, che però già in questa tuisce in un colpo solo tutte le pemutazioni.
prima versione è in grado di risolvere la mag- Poichè ogni permutazione è un vettore di tipo
gior parte dei problemi citati in precedenza. T (dove T è definito al momento di istanziare
Per i problemi non particolarmente comples- la classe generica Permutations), allora il ri-
si, utilizzare questa libreria è davvero sempli- sultato di questo metodo è un jagged array
ce: si crea una istanza della classe e si passa di tipo T, ovvero un vettore dove ciascun ele-
al costruttore un vettore contenente tutti gli mento è a sua volta un vettore di tipo T.
elementi da permutare, poi si entra in un ci-
clo For Each che permette di enumerare tut- ‘ VB
te le possibili permutazioni. La classe Permu- Dim results()() As Char = perms.GetAllPermutations()
tations usa i generics, in modo da accettare // C#
e restituire un array tipizzato contenente gli char[][] results = perms.GetAllPermutations();
elementi che devono essere (o che sono sta-
ti) combinati: La classe Permutations è anche in grado di
determinare le permutazioni di un gruppo di
‘ genera le permutazioni dei caratteri A,B,C,D K elementi presi dall’insieme di N elementi
Dim elements() As Char = {“A”c, “B”c, “C”c, “D”c} forniti in input, con K <= N . Per ottenere tali
Dim perms As New Permutations(Of Char)(elements) permutazioni basta passare al costruttore un
For Each chars() As Char In perms secondo argomento, pari al numero K di ele-
‘ crea e visualizza la stringa ottenuta menti che devono apparire nel risultato:
‘ concatenando i caratteri in the risultato
Console.Write(New String(chars) & “, “) ‘ genera le permutazioni dei due caratteri scelti tra
Next ‘ i caratteri A,B,C,D
Dim elements() As Char = {“A”c, “B”c, “C”c, “D”c}
Il codice C# è altrettanto semplice: Dim perms As New Permutations(Of Char)(elements, 2)
‘ .... per ciascun loop come prima
// genera le permutazioni dei caratteri A,B,C,D
char elements[] = {“A”c, “B”c, “C”c, “D”c};
Ecco il risultato generato dal ciclo:
Permutations<Char> permutations = New Permutations<Char>
AB, AC, AD, BA, BC, BD, CA, CB, CD, DA,
(elements);
DB, DC,
foreach ( char[] chars in perms )
{
// crea e visualizza la stringa ottenuta La classe Permutations permette di risolvere
// concatenando i caratteri del risultato una numerosa classe di problemi combinato-
Console.Write(new string(chars) + “, “); ri e statistici. Ad esempio, se A,B,C,D rappre-
} sentano 4 città, l‘insieme delle permutazioni
rappresentano tutti i possibili percorsi che le
Ecco il risultato che appare nella finestra di uniscono e che non ripassano mai da una di
console, ovvero tutte le possibili permutazioni esse: un programma può facilmente analiz-
degli N elementi forniti in input: zare questi percorsi per trovare quello che
richiede meno tempo o ha un costo minore.
ABCD, ABDC, ACBD, ACDB, ADBC, ADCB, BACD, Se invece gli elementi rappresentano possi-
BADC, BCAD, BCDA, BDAC, BDCA, CABD, CADB, bili azioni – ad esempio, l’azione di sistemare
CBAD, CBDA, CDAB, CDBA, DABC, DACB, DBAC,
una pedina su una determinata casella delle
DBCA, DCAB, DCBA,
scacchiera – allora l’insieme delle permuta-
zioni permette di stabilire quale sequenza di
Invece di un loop For Each potete anche usa- azioni tra quelle possibili permette di ottenere
re il metodo GetAllPermutations, che resti- il risultato migliore (ad esempio, vincere una
Sub GeneratePermutations()
‘ genera le permutazioni delle cifre 1-5
Dim elements() As Integer = {1, 2, 3, 4, 5}
Dim permutations As New Permutations(Of Integer) _
Figura 2 Ricerca delle soluzioni per il problema delle
(elements, 5, PermutationKind.Permutations, 1, _ regine (e delle amazzoni)
AddressOf PermutationFilter)
For Each perm() As Integer In permutations
Dim sb As New System.Text.StringBuilder è stato appena aggiunto prima di chiamare il
For Each n As Integer In perm metodo di callback. Il terzo argomento è Fal-
sb.Append(n) se se la permutazione è stata costruita, True
Next se siamo in fase di backtrack (vedi dopo). Il
Console.WriteLine(sb.ToString) metodo deve restituire PermutationResult.P
Next roceed se la permutazione può essere accet-
End Sub tata, Permutation-Result.Backtrack se deve
essere scartata.
Private Function PermutationFilter( _ La possibilità di effettuare backtracking, ov-
ByVal permutation() As Integer, _ vero di tornare indietro sui propri passi se il
ByVal level As Integer, _ metodo di callback restituisce PermutationRe
ByVal backtracking As Boolean) As PermutationResult sult.Backtrack, aumenta enormemente il po-
‘ l’elemento appena aggiunto tenziale della libreria e le permette di risol-
Dim number As Integer = permutation(level) vere problemi combinatori molto complessi.
‘ esegue il backtracking se l’elemento non è Ecco ad esempio una classe che risolve il fa-
‘ uguale alla sua posizione moso problema delle regine, ovvero come si-
If number <> (level + 1) Then stemare N regine su una scacchiera N*N in
Return PermutationResult.Proceed modo che non si diano scacco a vicenda. Si
Else tratta di un classico problema combinatorio
Return PermutationResult.Backtrack su cui, prima dell’avvento dei computer, si
End Function sono arrovellati dei geni come Gauss e altri
famosi matematici.
La procedura di callback, detta anche proce- Questo problema corrisponde a trovare una
dura di filtro, accetta tre argomenti e restitui- permutazione dei numeri 1-N, dove ogni ele-
sce un enumerativo PermutationResult. Il pri- mento P(n) della permutazione rappresenta
mo argomento è il vettore che rappresenta la la colonna in cui posizionare la regina della
permutazione che è stata costruita fino a quel riga N. Il solo fatto di richiedere permutazio-
momento; il secondo argomento rappresenta ni delle cifre 1-N (dove ogni elemento della
il livello di costruzione della permutazione, permutazioni può apparire una sola volta) as-
ovvero l’indice zero-based dell’elemento che sicura che le regine si trovino su colonne ol-
.NET Sql
Authorization Manager
(NetSqlAzMan)
Il nome è pittoresco ma non si tratta né di un super-eroe,
né di un dentifricio raccomandato dai migliori dentisti
italiani. È un gestore di autorizzazioni per applicazioni
sviluppate con il .NET Framework 2.0 (smart-client/
web). NetSqlAzMan
di Andrea Ferendeles
ceforge.net.
N
etSqlAzMan è rivolto a tutti gli svi-
luppatori Microsoft .NET 2.0 che ne- Sicurezza nelle
cessitano di gestire autorizzazioni ap- applicazioni
plicative loosely-coupled, cioè debolmente ac- Quando si parla di sicurezza
coppiate con il codice sorgente, in modo velo- applicativa è possibile in gene-
ce e snello avendo queste autorizzazioni sem- re scrivere simbolicamente la se-
pre a disposizione in un database relazionale guente equazione:
come MS Sql Server (2000/MSDE/2005/Express).
Chi di voi già conosce MS Authorization Manager { Sicurezza } = { Autenticazione }
(AzMan) oppure ADAM (Active Directory Applica- + { Autorizzazione }
tion Mode) allora è nel posto giusto… ma aspetta-
tevi tante novità. dove per Autenticazione si in-
tende la fase di verifica delle cre-
NetSqlAzMan è un progetto open source ed denziali (chi sei?) e per Autoriz-
è ospitato dalla community SourceForge.net. zazione, il momento in cui, ac-
Da questo link è possibile scaricare sia i sorgen- certata l’identità dell’utente, si
ti (C#.net) sia il pacchetto di installazione (.MSI) guarda a cosa questo utente può
per la piattaforma Win32: http://netsqlazman.sour- o non può fare. In genere la fase
di autenticazione avviene prima
Andrea Ferendeles, si occupa da diversi anni di sviluppo, di tutte ed è sufficiente accerta-
progettazione software e basi dati su tecnologia Microsoft. re una sola volta le credenziali
È attualmente alle dipendenze della società Eidos Sistemi di
Formazione e collabora con Microsoft Italia per la gestione del dell’utente senza poi ogni volta
Microsoft eGovernment Competence Center per la Pubblica (a run-time) ripetere tale opera-
Amministrazione. Ha partecipato come speaker a conferenze zione (pensiamo al momento del
tecniche come TeckTalk 2004 tenendo sessioni su tematiche
“logon” sul nostro PC).
legate all’accesso dati avanzato con Sql Server e .NET e alla
realizzazione di servizi Windows con .NET. È certificato MCT, La seconda fase dà per scontato
MSF, MCSD e MCDBA. Può essere contattato tramite e-mail che qualcuno abbia già procedu-
all’indirizzo ferendeles.andrea@fastwebnet.it. to alla verifica delle credenziali e
che quindi l’identità dell’utente sia “accerta- ed alcuni “Ruoli Applicativi” ovvero gruppi
ta” e “nota”. A questo punto, di fronte alla ri- di persone che nell’Applicazione posso com-
chiesta dell’utente di una applicazione, di ese- piere le medesime operazioni. Supponiamo
guire una determinata operazione, il sistema che l’applicazione che stiamo scrivendo deb-
di Autorizzazioni fornisce una risposta, prele- ba avere funzioni di gestione della contabilità
vando tutte le informazioni necessarie a pren- aziendale, del magazzino e così via, insomma
dere tale decisione da una qualche fonte dati il classico gestionale.
(ad esempio le ACL del File System).
L’applicazione dovrà operare delle distinzioni
Volendo a tutti costi fare un esempio, basta e permettere determinate operazioni ad utenti
pensare a quando ci rechiamo in aeroporto ben specificati, mentre ad altri le stesse ope-
per prendere un aereo. razioni dovranno essere negate. Per esempio
Quando ci presentiamo al Check-In, ci vie- consideriamo l’operazione “visualizza - bilan-
ne chiesto biglietto aereo e documento d’iden- cio di fine anno” che riporta in dettaglio i co-
tità e ci viene rilasciato un “ticket” di sicu- sti ed i ricavi di un anno di attività. È ragione-
rezza che è costituito dalla “carta d’imbarco” vole dire che tale operazione deve esser con-
(Autenticazione). A questo punto, e solo dopo cessa solo all’amministratore dell’azienda e al
aver ritirato la carta d’imbarco, possiamo re- più ai suoi dirigenti, ma sicuramente non agli
carci all’uscita preposta per il nostro volo. Al- impiegati. È inoltre ragionevole pensare che
l’interno della zona d’imbarco però, non sare- spesso l’amministratore od uno dei suoi diri-
mo “autorizzati” a prendere un volo qualsia- genti, per pura pigrizia o mancanza di tempo,
si ma solo ed esclusivamente il volo indicato vogliano “delegare” questa operazione ad una
nella carta d’imbarco stessa; tale controllo si segretaria, ovvero concederle (magari tempo-
esaurisce al momento dell’imbarco (Autoriz- raneamente) il permesso di compiere tale ope-
zazione) e solo dietro presentazione del “tic- razione in loro vece.
ket” rilasciato durante il check-in. Mi scuso
se l’esempio è risultato banale ma è bene fare Ora, come si può realizzare un’applicazione
chiarezza, almeno in questo contesto, per ca- del genere, senza “cablare” nel codice istru-
pire esattamente in quale contesto NetSqlAz- zioni del tipo:
Man si colloca.
If (utente = “Mario” or utente = “Giuseppe”) then
Ed eccoci dunque al punto: NetSqlAzMan è (autorizzato)
proprio colui che conserverà e custodirà le au- Else
torizzazioni, dando risposta “si, sei autorizza- (non autorizzato)
to” oppure “no, non sei autorizzato” a chiun-
que ne faccia richiesta (le applicazioni). Net- In primo luogo dobbiamo cercare di astrarre
SqlAzMan si appoggia invece al sistema ope- il più possibile dal concetto di “singolo uten-
rativo MS Windows per espletare la fase di te” e passare invece al concetto di “gruppo di
autenticazione (Kerberos / NTLM). utenti” ovvero un insieme di utenti a cui que-
sta operazione verrà concessa. All’atto poi del
Cerchiamo ora di capire, con un esempio disegno fisico decideremo quali utenti appar-
concreto, il meccanismo delle autorizzazio- tengono a quale gruppo:
ni in un contesto applicativo. Immaginiamo
una applicazione gestionale di una Azienda If (utente appartiene al gruppo “Amministratori”) then
qualunque. All’interno di questa Azienda pos- (autorizzato)
siamo sicuramente identificare alcuni “Ruoli Else
Aziendali” come ad esempio: l’amministrato- (non autorizzato)
re, i dirigenti, le segretarie, gli impiegati, ecc.
Ms AzMan:
• È COM.
• È dotato di una console mmc 2.0 (COM).
• Il suo storage può essere un file Xml o ADAM (Active Directory Application Mode – è un LDAP).
• È role-based.
• Supporta gruppi applicativi statici/dinamici, members/non-members.
• Struttura formata da Roles Tasks Operations. (Roles e Tasks gerarchici, Operations no).
• Si possono dare autorizzazioni solo ai Ruoli.
• Non implementa il concetto di “delega”.
• Non gestisce le autorizzazioni “nel tempo”.
• Non scatena eventi.
• L’unico tipo di autorizzazione è “Allow” (per dire “deny” occorre rimuovere l’utente/gruppo dal Ruolo).
• Supporta Scripting / Biz rules.
NetSqlAzMan:
• È .NET 2.0.
• È dotato di una console mmc 3.0 (.NET).
• Il suo storage è un database Sql Server (2000/MSDE/2005/Express).
• È basato su tecnologia Tdo -Typed Data Object.
• È Item-based.
• Struttura formata da Roles Tasks Operations. (Tutti gerarchici).
• Si posso dare autorizzazioni a Ruoli, Task e Operazioni.
• Supporta gruppi applicativi statici/dinamici, members/non-members.
• Test delle query LDAP direttamente dalla console.
• È time-dependant.
• È delegate-compliant.
• Scatena eventi (ENS).
• Supporta 4 tipi di autorizzazione:
o Allow with delegation (autorizzato e autorizzato a delegare).
o Allow (autorizzato).
o Deny (non autorizzato).
o Neutral (permesso neutrale, dipende dai permessi degli Items di livello superiore).
• Autorizzazioni gerarchiche.
• Non supporta Scripting / Biz rules.
Così facendo però stiamo introducendo un te può fare o no quella determinata opera-
legame troppo forte tra i “gruppi” e ciò che i zione. L’unico elemento di collegamento tra
gruppi stessi “possono fare”. Cosa accadreb- l’applicazione e il repository delle autorizza-
be infatti se domani decidessimo di passare zioni, è il nome dell’operazione stessa. L’in-
di competenza una certa operazione da un sieme di tali nomi definisce “un contratto”
gruppo ad un altro? e, come tale, è vincolante; se si cambia o nel-
Proviamo allora ad operare un ulteriore pro- l’applicazione o nel repository anche il nome
cesso di disaccoppiamento e dire: di una sola operazione sarà necessario modi-
ficare l’altro/a di riflesso.
If (utente è autorizzato a compiere l’operazione X) then
(autorizzato) L’identificazione univoca dell’utente ci ver-
Else rà fornita dal sistema di Autenticazione (Win-
(non autorizzato) dows), mentre il sistema di Autorizzazioni do-
vrà rispondere “si” o “no” alla domanda “è au-
Siamo passati in questo modo a fare la cosa torizzato a compiere l’operazione X”?. È ne-
più semplice e naturale e cioè a chiederci, a cessario dunque conservare in qualche repo-
prescindere dal nome ed a prescindere dal sitory, una specie di tabella di verità che per
gruppo/ruolo di appartenenza, se quell’uten- ogni “operazione” esprima il “si” o il “no” per
Figura 2 Eseguire la query LDAP direttamente dalla Figura 3 Definizione di Members nel gruppo Basic
console di NetSqlAzMan
NetSqlAzMan risolve a run-time. In questo Gli Store Group hanno una visibilità circo-
modo è ad esempio possibile creare un grup- scritta a livello di Store, quindi saranno vi-
po di utenti Active Directory che abbiamo un sibili da tutte le Application contenute nel-
nome che inizi per “Andrea” e permessi di lo Store.
Dial-In. In Figura 1 vediamo come creare uno
Store Group; nel codice sotto un esempio di Gli Store Group sono l’ideale per implemen-
query LDAP per includere tutti gli Utenti Ac- tare il concetto di “Ruolo Aziendale” ovvero
tive Directory che abbiano un nome che inizi un raggruppamento di persone che in Azienda
per Andrea e permessi di Dial-In ed in Figura svolgono una determinata funzione a prescin-
2 come eseguire la query LDAP direttamente dere poi dai diritti che ciascuno ruolo avrà in
dalla console di NetSqlAzMan. ogni applicazione; ecco alcuni esempi di ruoli
aziendali: “Dirigenti”, “Impiegati”, “Respon-
(&(objectCategory=user)(cn=Andrea*)
(msNPAllowDialin=TRUE))
Item Definitions
All’interno di ogni Application si possono
definire infiniti Item; ogni Item può essere
di tipo Ruolo, Attività od Operazione (Role,
Task, Operation). A ciascun tipo di Item at-
tribuiremo rispettivamente il seguente signi-
ficato logico:
• Role: è un insieme di “utenti” che nel-
l’applicazione possono compiere le
stesse operazioni;
o Un Role può avere membri di tipo
Role, Task, Operation.
o Esempi di Role sono: “Amministrato- Figura 6 Assegnare una descrizione ad un oggetto
re”, “Responsabile”, “Visualizzato- Application
re”.
nuovo utente”, “Modifica utente”, “Vi- due Operation (Item membri). Questo fatto
sualizza Report 1”. sarà di particolare rilievo quando andremo ad
assegnare le autorizzazioni a questi Item, in
Spesso accade che logicamente il poter com- quanto i diritti dati al Task (Item contenitore)
piere una determinata operazione significhi saranno ereditati dalle Operation (Item mem-
automaticamente poterne compiere delle altre bri) ma non avverrà il viceversa (ereditarietà
magari di sotto livello, oppure si può utilizza- verso il basso); chi sarà autorizzato a “modi-
re strumentalmente questo concetto per asse- ficare” sarà implicitamente autorizzato anche
gnare delle autorizzazioni gerarchiche. a poter “inserire” e “cancellare”. In Figura 7
un esempio di questa gerarchia.
Consideriamo, a scopo di esempio, le ope-
razioni di “Cancellazione” ed “Inserimento” Quando avremo creato tutte le Operation
e supponiamo che esistano alcuni gruppi di ed, aggregate in Task logici dell’Applicazio-
utenti autorizzati a “cancellare”, altri autoriz- ne, potremo finalmente dire cosa può fare ogni
zati ad “inserire” ed altri ancora autorizzati a Ruolo applicativo. Creiamo tanti Role quanti
poter sia “cancellare” che “inserire”. In questo sono i ruoli applicativi individuati nell’ana-
caso è opportuno creare un Task “Modifica” e lisi dell’applicazione ed indichiamo per cia-
due Operation “Inserimento” e “Cancellazio- scun Ruolo quali solo i Task di cui quel Ruo-
ne”, quindi entrare nelle proprietà del Task lo si compone.
(dalla console) e dire che esso è composto da
Item Authorizations
Una volta definiti tutti gli Item (Role, Task, Il “cosa” sarà uno degli Item definiti al pas-
Operation) e creata una opportuna gerarchia so precedente.
tra essi, ci dovremo preoccupare di “riempi- • Role
re” questi contenitori con utenti/gruppi reali • Task
e quindi “chi … può fare … cosa”, indicando • Operation
per ciascuno di essi i permessi.
Il “chi” potrà essere uno seguenti oggetti: Se la gerarchia degli Item è stata costruita
• Un utente Windows correttamente, in genere, e a meno di situazio-
• Un gruppo Windows ni particolari, sarà sufficiente assegnare per-
• Uno Store Group messi solo ai Ruoli. Quando un’applicazione
• Un Application Group chiederà a NetSqlAzMan … “posso fare l’Ope-
razione X ?”, il run-time verificherà se l’ope-
Il “può fare” potrà essere una delle seguen- razione appartiene ad un Task che a sua vol-
ti autorizzazioni: ta appartiene ad un Role di cui l’utente del-
• Allow with delegation l’applicazione fa parte.
• Allow
• Deny Se dalla console NetSqlAzMan si seleziona-
• Neutral no una o più Application, o addirittura l’inte-
NetSqlAzMan è
Time-dependant
Ogni autorizzazione può esse-
re “elargita” per un intervallo di
tempo indeterminato o determina-
to. I due campi Valid From e Valid
To nella finestra delle autorizzazio-
ni indicano rispettivamente la data
(e ora) di inizio e fine validità del-
l’auorizzazione stessa. Combinan-
do questa caratteristica con la pos-
sibilità di aggiungere più di un’au-
torizzazione per soggetto e per in-
tervalli temporali diversi, più l’ere-
ditarietà delle autorizzazioni, più la
Figura 9 Impostazione delle informazioni di
tipologia del permesso (consenti o connessione allo Storage di NetSqlAzMan
nega) è possibile esprimere auto-
rizzazioni che mutano nel corso del
tempo. Si può dire ad esempio che Un tipico utilizzo degli attributi è quello dei
un utente “u1” potrà eseguire l’Item “x” solo dati di profilo di un utente. Supponiamo che
dal 1-gen-2006 al 30-giu-2006 e successivamen- un utente “u1” rivesta in una Azienda IT il
te dal 1-gen-2007 al 30-giu-2007. In questi due ruolo di “Capo progetto” di un certo proget-
intervalli temporali potremo inoltre escludere to “p1”; immaginiamo inoltre che nell’Azien-
periodi specifici, aggiungendo altri permessi da sia stata sviluppata una applicazione che
per intervalli minori e di tipo Deny. consenta ai capi-progetto di monitorare lo sta-
Stesso identico discorso può esser fatto per to di avanzamento dei progetti loro assegna-
le deleghe, in quanto esse sono a tutti gli ef- ti. Supponiamo anche che l’applicazione con-
fetti delle autorizzazioni. templi fra gli altri una operazione “Controlla
SAL” (Stato Avanzamento Lavori). Che succe-
Authorization Attribute de se l’utente “u1” volesse delegare un utente
L’ultimo anello della catena di questa strut- “u2”, risorsa di fiducia del suo team di svilup-
tura è rappresentato dagli Authorization Attri- po, a controllare in sua vece lo stato del pro-
bute ovvero gli attributi di una autorizzazione. getto “p1”? Una delega adoperata da “u1” a
Fisicamente un attributo è rappresentato da “u2” direbbe che “u2 è autorizzato a compie-
una semplice coppia “key-value” (chiave-va- re l’operazione Controlla SAL al posto di u1”
lore) entrambi di tipo stringa. Per ogni Autho- ma non si porterebbe appresso l’informazio-
rization è possibile definire infiniti attributi ne … “…per il solo progetto p1”.
con il solo vincolo che il nome dell’Attribute
(la parte key) dovrà essere univoca per quel- L’aggiunta di un attributo “progetto-p1” (key-
l’autorizzazione. Viceversa sarà possibile de- value) all’autorizzazione di delega da “u1” a
finire un altro attributo con la stessa key in “u2” risolve tale problema; resta il fatto che
un’altra autorizzazione. NetSqlAzMan di fronte ad una richiesta di
“u2” di “posso eseguire l’item Controlla SAL?”
Lo scopo degli Authorization Attribute è risponderà Allow; sarà poi compito dell’ap-
quello di consentire al livello più capillare plicazione leggere gli eventuali Authoriza-
l’aggiunta di informazioni custom per ogni tion Attribute e filtrare l’elenco dei proget-
singola autorizzazione, aumentando così il li- ti da utilizzare per l’operazione. Altri esempi
vello di granularità dei permessi. di attributi sono dati da: “Data di autorizza-
• Start – Esegui –
NetSqlAzMan.msc
Requisiti di installazione
• Windows 2000/XP/2003
• .NET Framework 2.0
(http://msdn.microsoft.com/netframework/downloads/updates/default.aspx)
• MMC (Microsoft Management Console) 3.0
(http://www.microsoft.com/downloads/details.aspx?familyid=61FC1C66-06F2-463C-82A2-
CF20902FFAE0&displaylang=it)
• Sql Server 2000/MSDE/2005/Express
(http://msdn.microsoft.com/vstudio/express/sql/download/)
using NetSqlAzMan;
Role; sempre nell’esempio viene creata una using NetSqlAzMan.Interfaces;
Authorization ed un AuthorizationAttribute. using NetSqlAzMan.ENS;
Ricordiamoci che l’utente che eseguirà tale ...
codice dovrà appartenere al Database Role di SqlAzManENS.StoreCreated +=
Sql: NetSqlAzMan_Administrators. new StoreCreatedDelegate(SqlAzManENS_StoreCreated);
...
Le API utilizzano Tdo - Typed Data Object void SqlAzManENS_StoreCreated(IAzManStore storeCreated)
(vedi [3]) per leggere e scrivere da Sql Ser- {
ver e questo implica un aumento delle per- System.Diagnostics.Debug.WriteLine(
formance e tutta la sicurezza (ad esempio no storeCreated.Name + “ store created”);
Sql injection) fornita da Tdo. }
Ringraziamenti
Generics in
C# 2.0
L’introduzione della programmazione generica è
sicuramente la novità più interessante del .NET 2.0,
scopriamone le caratteristiche principali.
Generics
L
non opera su un tipo particolare
di dato e che incapsula un set di
a programmazione generica espande for- operazioni standard.
temente le possibilità offerte dai normali linguaggi,
permettendo la creazione di codice “generico”, ov- Nel .NET 1.1 il massimo del-
vero non vincolato ad uno specifico tipo di dato. Il la genericità si ottiene facendo
primo esempio di rilievo di programmazione gene- discendere tutti gli oggetti dal
rica si ha con i template del C++, sui quali è inte- tipo base object, un approccio uti-
ramente basata la libreria STL. Il framework .NET lizzato anche da altri linguaggi
2.0 introduce in maniera analoga il concetto di ge- moderni come il java. Sebbene
nerics, un estensione disponibile in tutti i linguag- questa tecnica permetta un cer-
gi .NET, perché propria del framework. In questo to livello di astrazione dal tipo
articolo l’argomento verrà affrontato nell’ottica del di dato, non è sicuramente pa-
C#, ma i concetti esposti sono naturalmente vali- ragonabile a quello che si può
di anche per Visual Basic e per qualsiasi altro lin- ottenere con un generics o con
guaggio .NET 2.0 compatibile. un template.
Come esempio si consideri un semplice pro- Per ripararci da errori di questo tipo bisogne-
gramma in cui si chiede all’utente di inserire rebbe quindi racchiudere in un try catch ogni
una serie di numeri interi e di calcolarne poi parte di codice che accede al contenuto di un
la media. L’esempio è contenuto nella funzione arraylist, operazione che è assolutamente im-
Main1() del progetto Generics accluso, è scritto proponibile per non ridurre drasticamente la
in C# 2.0, ma non fa uso di generics, bensì di leggibilità del codice. Con il .NET 1.1 l’unica
un normale contenitore. Il ciclo di lettura può soluzione era far derivare una propria clas-
essere fatto in questo semplice modo se da ArrayList o da CollectionBase e fare il
wrapping dei metodi Add(), Index(), etc per ot-
while (InsertLine != “” ) { tenere una collection strongly typed. In pro-
if (Int32.TryParse(InsertLine, out InsertValue)) getti di grande dimensione questo porta ine-
list.Add(InsertValue); vitabilmente ad avere una collection specializ-
InsertLine = Console.ReadLine(); zata per quasi tutti i tipi di dato definito dal-
} l’utente, perdendo così in parte il vantaggio
della genericità e tornando alla vecchia pra-
Una nota va fatta riguardo al metodo TryPar- tica del copia ed incolla, la cui eliminazione
se(), nuova aggiunta del framework 2.0 presen- è lo scopo principale della programmazione
te in tutti i tipi base di dato e che risolve un generica. Questa pratica inoltre è altamente
problema spinoso presente nella vecchia ver-
sione. Con il .NET 1.1 infatti tutti i tipi hanno
il metodo Parse() che permette di convertire un
La programmazione
valore stringa nel tipo di dato richiesto lan-
ciando un eccezione se la stringa non è in un generica riduce
formato corretto. Questo approccio costringe drasticamente la procedura
ad utilizzare blocchi try-catch per intercetta-
re eventuali errori di formato, operazione che del copia ed incolla
rende il codice meno leggibile e che diminui-
sce seriamente le performance. In .NET 2.0
tutti i tipi hanno invece il metodo TryParse() inefficiente, se si ha la necessità di aggiungere
che effettua la conversione richiesta inseren- un nuovo metodo alle collection così genera-
do il risultato nel secondo parametro (che è te è necessario modificare file per file, con il
passato come ref out) restituendo contempo- rischio di dimenticarne alcuni ed avere quin-
raneamente un bool che indica se la conver- di comportamenti incoerenti.
sione è riuscita o meno. Quello che interessa
però è il ciclo che esegue la media Con il .NET 2.0 le classi generiche risolvono
il problema in maniera decisamente più effi-
int Media = 0; ciente, ecco ad esempio come dichiarare una
for (int I = 0; I < list.Count; ++I){ lista di interi:
}
Creare una classe generic
} Per comprendere meglio il funzionamento è
interessante mostrare come si scrive codice
generico realizzando una rudimentale classe
che implementa uno stack. Il codice completo
System.Collections.Generic.List<int> list = è mostrato nel listato1 ed ha solamente uno
new System.Collections.Generic.List<int>();
scopo esemplificativo, dato che nel framework
è già contenuta una classe generica stack per-
Una classe generica incapsula infatti una se- fettamente funzionante. La sintassi è sempli-
rie di operazioni che non dipendono dal tipo ce da ricordare, basta indicare il nome del tipo
di dato permettendo quindi la creazione di generico su cui la classe opera, in questo caso
codice che fornisce un set di operazioni stan- T ed utilizzarlo internamente alla classe come
dard altamente riutilizzabile. Un contenitore se fosse un tipo vero e proprio.
è l’esempio più chiaro di codice non legato
ad un tipo di dato specifico che offre metodi Come si è visto nell’esempio precedente il
di inserimento, rimozione, ricerca, ecc., il cui tipo di dato viene specificato solamente in fase
comportamento è assolutamente indipenden- di definizione ed è in questo momento che vie-
temente dagli oggetti trattati. ne generata nell’assembly la classe specifica.
Per comprendere meglio il processo si può im-
Il tipo di dato su cui si deve operare vie- maginare che il compilatore, quando incontra
ne comunque specificato al momento della un oggetto di tipo MyStack<int>, prenda il co-
dice della classe generica, sostituisca ad ogni Naturalmente il framework.NET prevede ne-
occorrenza di T il tipo int, dia alla classe un cessità simili e il codice precedente può esse-
nome tipo MyStak_Int ed infine la compili re utilizzato corettamente a patto che venga
assieme alle altre. Il processo vero e proprio rassicurato il compilatore sull’esistenza del
è differente, ma il concetto base è che viene metodo T.Clone(). Con il .NET infatti un tipo
comunque generata una classe specifica per generico T dichiarato come nel Listato1 viene
gestire ogni tipo di dato. chiamato Unbounded type parameter ad indicare
che non sono state specificate restrizioni. In
Per chi fosse abituato ai template del C++ pratica si può pensare che sia lecito utilizzare
la più grande differenza che si incontra è si- il tipo T in ogni situazione in cui sarebbe leci-
curamente l’impossibilità di scrivere codice to utilizzare un generico object, ma non oltre,
che potenzialmente non compila durante la è per questo che non si può assumere che il
fase di istanziazione. Si supponga ad esem- tipo T supporti il metodo Clone(). Questa li-
pio di volere aggiungere alla classe Stack un mitazione può essere superata introducendo
metodo PopCopy() che ritorna una copia del- delle restrizioni, ad esempio dichiarando la
l’oggetto in cima allo stack senza rimuover-
lo dallo stack stesso. In questo modo il chia-
mante può utilizzare la copia senza andare a
modificare l’istanza originaria. Una prima im- Non solo le classi, ma
plementazione potrebbe essere: anche le interfacce ed i
public T PopCopy() { delegate possono essere
if (Peek()) return (T)basearray[stackPos-1].Clone(); resi generici
throw new IndexOutOfRangeException(“Stack is empty”);
}
classe in questo modo:
Questa funzione semplicemente chiama il
metodo Clone() del tipo generico T per ottene- class MyStack2<T> where T:ICloneable {
re una sua copia, ma in fase di compilazione
si genera un errore perché il tipo generico T La clausola where serve per aggiungere delle
non ha una definizione per il metodo Clone(). restrizioni al tipo T; in questo esempio si ri-
Questo può apparire ragionevole per chi non chiede di implementare l’interfaccia ICloneable.
conosce il C++, anche perché la programma- Con questa modifica il metodo PopCopy() vie-
zione generica dovrebbe essere appunto “ge- ne compilato correttamente, dato che il com-
nerica” e non basarsi su metodi che sono in- pilatore è ora certo che il tipo T possieda il
vece specifici di alcuni oggetti. metodo Clone().
In C++ invece un codice analogo è perfetta- Le limitazioni che si possono imporre sono
mente legale e gli eventuali errori sono posti- di cinque tipi. Si può richiedere che il tipo T
cipati al momento in cui si istanzia il template. sia una classe o una struct, utile ad esempio
Se anche in C# fosse valido questo approccio, per evitare operazioni eccessive di boxing ed
si avrebbe la seguente situazione: MyStack<int> unboxing o comunque per capire come ge-
non compila perché il tipo int non ha il meto- stire le copie degli oggetti. Un’altra restrizio-
do Clone(), ma un MyStack<System.Array> compi- ne è richiedere invece che l’oggetto abbia un
lerebbe senza problemi perchè gli array sup- costruttore di default, utile se la classe deve
portano l’interfaccia ICloneable. creare istanze di un tipo generico. Infine si
può richiedere che il tipo erediti da una par-
metodo PushMyStack() dipende dal tipo gene- ferente e quindi si vengono a creare un nume-
rico U, il quale ha come restrizione la discen- ro molto elevato di delegate. Con il .NET 2.0
denza dal tipo T, ovvero il tipo base generico è possibile invece utilizzare il delegate base
della classe MyStack. Il parametro accettato di nome System.EventHandler<TEventArgs>. Cosi
da PushMyStack () è dichiarato ora come un facendo il framework può gestire ogni even-
oggetto di tipo MyStack2 parametrizzato sul to con un singolo tipo di delegate.
tipo generico U. In questo modo si dichiara
in pratica che il metodo PushMyStack () ac- Naturalmente l’introduzione dei generics
cetta come parametro un MyStack tipizzato porta molte aggiunte alla reflection. Il tipo
su un oggetto che eredita dal tipo T. System.type ha infatti una serie di metodi
dedicati alla gestione dei tipi generici tra cui
Quando si chiama un metodo generico è pos- ricordiamo IsGenericType() che serve per de-
sibile infine specificare al compilatore il tipo terminare a runtime se un tipo è generico o
in maniera esplicita, oppure affidarsi alla de- meno oppure il GetGenericArguments() che recu-
duzione automatica o inferenza. Se ad esempio pera un array di oggetti type utilizzati come
si crea un metodo Swap() generico in grado parametri generici. Addentrarsi nella reflec-
di invertire il contenuto di due variabili ge- tion sui tipi generici è però argomento com-
neriche: plesso che esula da una panoramica introdut-
tiva e può essere approfondito efficacemen-
Public static void Swap<T>(ref T par1, ref T par2) { te nell’msdn.
T temp = par1;
Par1 = par2; Conclusioni
Par2 = temp; L’introduzione dei generics è sicuramen-
} te una delle innovazioni più importanti del
.NET 2.0 perché rende possibile l’utilizzo del-
Lo si può indifferente invocare in uno dei le tecniche di programmazione generica che
due modi. portano a scrivere codice più leggibile con
una drastica riduzione del numero di cast,
Int var1 = +1; di classi contenitore strongly typed e di co-
Int var2 = -1; pia e incolla.
Swap(ref var1, ref var2); //1
Swap<int>(ref var1, ref var2); //2 Il supporto alla programmazione generica è
fornito direttamente dal framework e per que-
sto è disponibile per tutti i linguaggi, sebbe-
Altre particolarità ne ognuno di essi possa comunque adottare
Anche un delegate può essere generico, l’uti- una sua sintassi specifica. I concetti base sono
lità più grande è il poter finalmente definire inoltre universali e quanto visto in questo ar-
in maniera più semplice eventi strongly typed ticolo riguardo al C# si adatta naturalmente
seguendo il pattern consigliato nel .NET fra- anche al Visual Basic e a qualsiasi altro lin-
mework. Questo tipo di pattern consiste nel- guaggio managed che decida di supportare la
l’utilizzare delegate in cui il primo parame- programmazione generica.
tro è un riferimento all’oggetto che genera
l’evento stesso, mentre il secondo argomen-
to è un oggetto che contiene tutti i parametri
necessari per la gestione dell’evento e deve
sempre discendere dalla classe base EventAr-
gs. In .NET 1.1 questo fa si che ogni tipo di
evento ha potenzialmente un argomento dif-
Common Time
mSuite Security
I principali elementi funzionali e operativi di mSuite Security, prodotto dalla
CommonTime, con particolare attenzione alla sicurezza
C
reare applicativi sicuri per dispositivi Qualsiasi azienda che conside-
mobile non è così facile. ra seriamente la propria strate-
L’afflusso di tali dispositivi non di pro- gia di sicurezza deve rispondere
prietà dell’azienda è causa di preoccupazione per alle seguenti domande:
tre aree distinte: per la proprietà dell’azienda, per
il meccanismo di supporto, e in definitiva per gli • Protezione dei dispositivi
utenti stessi. Chi è autorizzato a utilizzare il
Perché ciò rappresenta un problema? dispositivo?
Perché i dispositivi hanno, e avranno in un pros- È disponibile la versione più
simo futuro, uno storage locale. recente dell’applicazione?
Una possibile risposta a questo problema di sicu- Le firme dell’antivirus sono ag-
rezza potrebbe essere: “Non abbiamo necessità di giornate e l’applicazione antivi-
uno storage locale. Le reti wireless hanno una am- rus è in esecuzione?
pia larghezza di banda, non sono soggette a inter- I dati sono memorizzati sul di-
ruzioni di rete, hanno una copertura mondiale del spositivo in un formato sicuro?
100%, e non sono costose. Se un dispositivo viene perso
Tuttavia, questa risposta non è corretta. La realtà o sottratto, i dati memorizzati
non è affatto quella descritta. sono accessibili?
I dispositivi client dovranno semplicemente man- Se un dispositivo viene sottrat-
tenere i dati localmente, e gli sviluppatori di appli- to, o in caso di tentativi di lo-
cazioni devono continuare a supportare gli scenari gin non autorizzati, si possono
talvolta online, talvolta offline. Finché l’utopia di rimuovere i dati sicuri?
un dispositivo mobile “stupido”, di una copertura
di rete del 100%, e di una infrastruttura a basso co- • Protezione durante il
sto non è una realtà, continueremo ad avere questi transito
rischi nella sicurezza. Come sono protetti i dati du-
La “trinità della sicurezza” riguarda la protezione rante il transito tra l’utente e
dei dati e dei dispositivi in tre aree: nel dispositi- l’azienda?
vo, nella trasmissione dei dati, e infine nei sistemi
business della sede aziendale. • Protezione aziendale
Se un dispositivo viene perso,
qualcuno può utilizzarlo per in-
© 2006 CommonTime Limited
trodursi nei sistemi aziendali?
Come si può essere certi di chi
si sta connettendo alla propria infrastruttu- mondo esterno”, dovrà essere più che certa
ra? di chi si connette all’infrastruttura, e di qua-
Come si può fornire una sicurezza diretta li servizi sono accessibili. L’autenticazione dei
o delle patch di fix, senza alcun intervento dispositivi client permette al server di veri-
dell’utente? ficare l’utente, e di autorizzarlo ad un parti-
Come si può essere certi che un dispositivo colare servizio di rete, prima di continuare a
sia abbastanza sicuro per permettergli di con- instradare la sessione.
nettersi alla rete?
Il dispositivo sta introducendo virus nell’am- Autenticazione
biente aziendale? Connection Manager Server: Il processo prin-
cipale di autenticazione avverrà nel Connec-
mSuite Security è un prodotto concepito tion Manager Server (CMS). Questo compo-
per fornire le risposte proprio a queste do- nente server fornisce 5 funzioni in mSuite:
mande.
• Autenticazione
Funzionalità • Autorizzazione
• Routing del processo server
Gestione dell’identità del client: • Comunicazione client
protezione dell’azienda • Crittografia “over the air”
Poiché un’azienda cercherà spesso di po-
sizionare la propria rete dietro i confini del Con crittografia (Standard): La suite di codi-
firewall proteggendosi dall’insicuro “sporco ci crittografici (AES 128,192,256) disponibile
I moduli di mSuite
Configuration Server
Fornisce l’accesso al database mSuite di tutti i prodotti mSuite. Questo database contiene la configurazione, i report e le
politiche richieste per eseguire un ambiente mSuite.
• Autenticazione client
• Instradamento del servizio
• Ottimizzazione della comunicazione
• Comunicazioni con mSuite Server
• Crittografia AES “over the air”
mNotes Server
Fornisce la sincronizzazione desktop, server e wireless delle email, dei calendari, dei task, dei contatti e del journaling Lotus
Notes/Domino compreso il supporto completo della funzionalità di calendario e dio scheduling per i gruppi di utenti.
mForms Server
Fornisce un sistema RAD di progettazione, testing, implementazione, deployment e gestione delle applicazioni business
per i dispositivi portatili. Attualmente, mForms funziona con l’ambiente CE/Windows Mobile, ma è prevista l’estensione del
supporto ad altri sistemi operativi per dispositivi come Palm e Symbian.
mControl
Fornisce il deployment dell’applicazione, la manutenzione continua e la gestione di politiche per singolo utente di dispositivi.
mSecure PDA
Fornisce la sicurezza fisica delle informazioni memorizzate sul dispositivo. I dati salvati sul dispositivo possono essere
crittografati e il dispositivo può essere protetto dall’utilizzo non autorizzato. Inoltre, l’utilizzo delle applicazioni può essere
autorizzato per un particolare dispositivo, o essere protetto da password.
Notification Server
Il Notification Server fornisce le interfacce UDP o SMS a un dispositivo remoto per la trasmissione di piccoli pacchetti di dati
asincroni (datagram) utilizzati per avviare la connessione ai server mSuite per poi procedere alla trasmissione delle ulteriori
informazioni. Ciò può accadere in conseguenza a un processo business, all’arrivo delle email, o a un processo reattivo, o per
fornire l’infrastruttura di “azzeramento dati” nel caso un dispositivo fosse sottratto. In caso di spegnimento del dispositivo,
la richiesta di notifica verrà accodata, e attenderà il dispositivo, o nel caso un SMS “svegli” il dispositivo per processare il
datagram.
un client richiede una sessione al Connection tografia AES tra il client e il Communication
Manager Server (CMS), il CMS passa prima Manager Server (CMS)
questa richiesta a un server di autenticazio-
ne, definito nella configurazione del CMS. Si CMS: crittografia AES
tenga presente che potrebbe trattarsi di un Lo standard Advanced Encryption Standard
processo nello stesso CMS o che risiede su (AES) è stato determinato in base a un’analisi
un server remoto, in base alle impostazioni. dei formati crittografici effettuata da 15 orga-
nizzazioni participanti. Il NIST (National In-
A questo punto al client viene uno dei se- stitute of Standards and Technology) america-
guenti attributi: no ha scelto l’algoritmo Rijndael come formato
AES. A differenza di DES, lo standard AES
• Combinazione Username/Password non espone alcun punto di debolezza noto del
• Username/Ticket di autenticazione codice di cifratura. I confronti del NIST rispet-
valido to a DES dimostrano che se un cracker DES
via hardware può “craccare” una chiave DES
Una volta avvenuta la presentazione corret- in un secondo, sarebbero necessari 149 “tri-
ta di uno di questi attributi, il CMS procede- lioni” di anni per il crack di una chiave AES
rà ad eseguire l’instradamento al servizio ri- a 128 bit. L’implementazione AES della Com-
chiesto. monTime si basa sul Security Builder di Cer-
ticom, e la crittografia AES si attiene al docu-
mento Federal Information Processing Stan-
dard (FIPS) 197.
Crittografia dei dati: proteggere i dati
in transito Certificati
Come si è discusso precedentemente, uno dei
Qualsiasi azienda è alle prese con la sfida di punti di forza del CMS è la capacità di gene-
fornire un’infrastruttura mobile che sia pron- rare una nuova chiave AES per ogni sessio-
tamente disponibile e che tuttavia garantisca ne, piuttosto che riutilizzare una chiave ge-
dei costi accessibili. Per questi motivi molti nerata una tantum.
utilizzano Internet come mezzo di comunica- A causa della frequente generazione di que-
zione. Implementando una soluzione Internet, ste chiavi, va considerata la protezione nello
la connettività può essere raggiunta da più scambio della chiave Diffie–Hellman dagli at-
Internet provider, dalle stanze di un hotel via tacchi di tipo “Man in the Middle”. Una cop-
GPRS o GSM. Questa flessibilità ha un prezzo pia costituita da una chiave server e da una
per ciò che concerne lo spostamento dei dati corrispondente chiave client elimina questo
su una rete non protetta, e di conseguenza non rischio.
andrebbe considerata senza aver predisposto Questo certificato server deve essere disponi-
una infrastruttura di crittografia. bile nell’account di memorizzazione del certi-
Molte aziende stanno installando una solu- ficato sulla macchina locale, la macchina su
zione VPN (Virtual Private Network) per più cui è in esecuzione il Connection Manager
aree della propria attività, permettendo l’ac- Server (CMS).
cesso a reti protette da IPSec da qualsiasi di- I certificati vengono inviati ai singoli e alle
spositivo. aziende da organizzazioni riconosciute e fida-
Per le aziende che desiderano adottare una te, dette Certificate Authority (CA)
infrastruttura di messagistica protetta e di ge- La mSuite Console e il CMS devono avere
stione senza dover investire nelle comunica- accesso a un certificato che abbia una chia-
zioni VPN, mSuite Mobility Framework forni- ve privata accessibile dal server (non necessa-
sce l’autenticazione, l’autorizzazione e la crit- riamente una chiave esportabile). Per la ver-
database di configurazione possono essere si modi, tra i quali quello di gran lunga più
gestiti da una policy centralizzata, così come semplice è l’ utilizzo dell’opzione “show me” di
gran parte degli aggiornamenti delle policy mControl dello snapshot dell’applicazione.
vengono memorizzati in queste aree. Questo approccio permette sia al motore
antivirus sia alla configurazione di essere di-
mControl stribuiti in un unico pacchetto. Una opziona-
La sicurezza condivide una relazione sim- le definizione di virus può essere distribuita
biotica con la gestione del dispositivo. Non si a questo punto o essere mantenuta come en-
può realmente imporre la sicurezza senza es- tità separata.
sere in grado di installare, controllare e ma- Le future versioni previste di mControl for-
nutenere il dispositivo. È anche vero che la niranno ai “connettori” antivirus la possibi-
gestione ha pochissimo effetto se il disposi- lità di scaricare e installare automaticamente
tivo non viene mantenuto in uno stato sicu- le definizioni aggiornate direttamente dal sito
ro. Il componente mControl di mSuite ha lo Web di un produttore o via FTP e di mante-
scopo di mantenere il dispositivo in uno sta- nere il controllo e il logging da un unico cen-
to valido noto e in definitiva di assicurare che tro di gestione.
l’utente mantenga la propria concentrazione
sulle funzioni business senza dover preoccu- Come accade per i firewall personali e i pro-
parsi della tecnologia. duttori di antivirus, un’azienda ha spesso del-
I compiti tipici che ostacolano la possibilità le preferenze sui fornitori. È perciò importan-
di un utente di lavorare comprendono: te mantenere un approccio agnostico alla ge-
stione, piuttosto che fornire l’opportunità di
o Perdita di produttività quando si sca- gestire più applicazioni di sicurezza e busi-
rica la batteria del dispositivo ness dalla stessa locazione centrale.
o Perdita di produttività nel cercare di
scaricare la recente patch di una applicazio- Ogni qualvolta un dispositivo viene presen-
ne tato a un mSuite Connection Manager Servi-
o Perdita di produttività dovuta all’in- ce, il primo “servizio dati” a cui si connette-
troduzione di codice subdolo rà sarà mControl. Ciò permette immediati ag-
o Perdita di produttività dovuta alla ve- giornamenti delle policy e delle impostazioni
locità con cui un’azienda richiede il cambio prima che al dispositivo sia permesso conti-
dell’applicazione – la forza lavoro distaccata nuare con gli altri task e servizi mSuite.
può avere necessità di visitare molto raramen- Ciò assicura che un dispositivo abbia una
te la sede centrale, perché ciò dovrebbe cam- sufficiente sicurezza prima che gli sia per-
biare a causa della distribuzione o dell’aggior- messo di continuare.
namento di un nuovo sistema mobile?
Le blacklist sono un metodo di protezione
mControl permette una distribuzione gesti- di un’infrastruttura dall’accesso non autoriz-
ta centralmente delle policy di antivirus ai di- zato. Il processo di disabilitare un particola-
spositivi mobile. Il motore antivirus in genere re dispositivo, anche se le credenziali utente
viene scelto dall’azienda, e sul server viene sono corrette, permette a un amministrato-
generato un pacchetto software di configura- re di bloccare i dispositivi smarriti o sottrat-
zione. Questo pacchetto può essere distribuito ti, o anche di inviare da remoto un comando
a livello di server o di gruppo, ma può anche di azzeramento per mezzo di una rete wire-
essere abbastanza specifico da essere adatta- less o via SMS.
to alle necessità di singoli utenti.
In base al produttore dell’antivirus, il de-
ployment della policy può avvenire in diver-
using System;
namespace mynamespace
{
/// <summary>
/// Classe d’esempio con documentazione XML per NDoc
/// </summary>
public class myClass
{
/// <summary>
/// L’entry point dell’applicazione
/// </summary>
public static void Main()
Figura 1 Documentazione in formato HmlHelp della classe myClass
{
int a = 2;
NDoc difficilmente rinunceremo ad esso. tere i parametri della connessione (quali il nome
Infatti, se da un lato il programmatore continua del database, l’utenza e la password) e (opziona-
ad accedere direttamente alla documentazione le) testare se la connessione ha avuto successo.
del codice tramite i commenti al codice stesso, A questo punto si caricano tutte le tabelle del da-
la stessa documentazione può essere resa
tabase tramite l’apposito bottone “Load Tables”
disponibile nel formato help che preferiamo
senza ulteriori passaggi o integrazioni. presente sulla maschera quindi ha inizio la scelta
dei parametri per la creazione del codice.
La scheda “Templates” presenta le possibilità di
Riferimenti scelta per la creazione del codice ma purtroppo qui
[1] http://sourceforge.net/projects/ndoc/ si denotano i limiti di questa applicazione: i tem-
[2] http://msdn.microsoft.com/library/ plate disponibili sono DAO e NHibernate e il lin-
default.asp?url=/library/en-us/dv_vstechart/ guaggio con cui viene generato il codice è il solo
html/VBGeneratingDocs.asp
C#. Come è noto a tutti, purtroppo DAO è una tec-
[3] http://msdn.microsoft.com/library/en-us/
csref/html/vclrfTagsForDocumentationComm nologia obsoleta di accesso ai dati, mentre NHi-
ents.asp bernate è il porting di un tool scritto nativamente
[4] http://sourceforge.net/projects/ndoc05 per Java per generare SQL per caricare e salvare
[5] http://jonas.lagerblad.com/blog/?p=4 oggetti che si mappano ad una base dati.
[6] http://dougrohm.com/cs/archive/2006/01/06/ Un’ulteriore pecca è rappresentata dal fatto che
36.aspx è possibile selezionare la creazione di una nuo-
[7] http://connect.microsoft.com/VisualStudio/ va soluzione, ma quest’ultima verrà creata solo
feedback/ViewFeedback.aspx?FeedbackID=9
in Visual Studio 2003, ed essendo la versione da
3842
noi provata di aprile 2006, ciò risulta senza dub-
bio uno svantaggio per chi utilizza già Visual Stu-
Codus dio 2005.
Generazione automatica di codice
di Fabio Perrone Passiamo ora agli aspetti positivi della maschera
di scelta dei template: sono presenti alcuni flag, le entità che verranno usate dall’interfaccia uten-
uno per la creazione di un file di build di NAnt te per la convalida dei dati. Oltre a tutto ciò ven-
ed un altro per la creazione di test di NUnit al- gono creati anche dei cosiddetti “Mock Objects”,
l’interno del codice creato in automatico, un altro particolarmente utili per la creazione dei test da
ancora per la creazione in automatico di Stored eseguire poi con NUnit.
Procedure (ovviamente attivo solo per i databa- Il secondo progetto che viene creato è totalmen-
se che lo permettono) ed infine uno per la crea- te dedicato ai test: per ogni classe vengono crea-
zione in automatico di Web Service per esporre i ti in automatico test per l’inserimento, la cancel-
dati tramite questa tecnologia. lazione, la modifica, la selezione di tutti i record,
Il tab “Tables” permette di scegliere quali tabel- la serializzazione degli oggetti business.
le e viste si desiderano per la creazione del codi- La documentazione del prodotto è disponibile
ce, nonchè arrivare a scegliere a livello di singo- solo on line e purtroppo non è completamente sod-
lo campo con possibilità di cambiare il nome del disfacente, anche se vengono comunque spiegate
campo stesso nella classe business. le funzionalità di base del programma.
Una volta impostate tutte le opzioni, è possi- Da ciò che abbiamo scritto, si evince quindi che
bile generare le classi business, cui ora daremo Codus è un prodotto senza dubbio valido ma al-
una breve occhiata. Per ogni tabella selezionata, trettanto migliorabile per quanto riguarda alcu-
vengono create tre collection: una ordinabile, un ni aspetti leggermente obsoleti; controllando sul
dictionary ed una che implementa IEnumerator, sito del produttore è tuttavia già stata pianifica-
così da poter utilizzare i suoi elementi in un ciclo ta la versione 1.4 del prodotto con supporto per
for each. Per ogni tabella o vista vengono quindi .NET 2.0 e per nuovi database, quali Firebird e
scritte le classi astratte con metodi che creano i PostgreSQL.
command per l’inserimento, la cancellazione e la Aspetto non trascurabile è la possibilità di ave-
modifica; è ovvio che queste classi rappresentano re a propria disposizione tutti i codici sorgenti
il “core” di qualsiasi applicazione che debba effet- dell’applicazione, così da poterne fare oggetto di
tuare l’accesso ai dati. Inoltre, vengono create le studio e anche per eventualmente personalizzare
classi di Business Logic che si mappano uno ad a proprio piacere il programma, estendendolo in
uno con le tabelle selezionate che rappresentano base alle proprie necessità.