HowTo – Guida ASP.NET (Parte 17)

PARTE 5 – CAPITOLO 17 – CRITTOGRAFIA

La crittografia è la scienza che studia la modifica di un messaggio e la generazione di Hash per aumentare la riservatezza. L’hashing, inteso come stringa MD5 o SHA1, è utile quando si vuole memorizzare una “impronta” del dato (tipicamente una password) al posto del dato stesso. Questi algoritmi rendono (virtualmente) impossibile risalire al dato originale partendo dall’hash (gli unici metodi di cracking sono il brute force, ovvero il confronto dell’hash con quelli creati sistematicamente dall’attacker e la generazione dello stesso hash partendo da input diversi). Gli algoritmi di hashing quindi non sono adatti per trattare informazioni che si vuole criptare (ad esempio il numero di carta di credito) e poi decriptare. Gli strumenti per criptare/decriptare si trovano nel namespace System.Security.Cryptography (algoritmi, helper, certificati X509, XML signatures ed encryption, CMS/PKCS#7). Le classi relative alla crittografia si dividono in tre livelli: al primo livello ci sono le classi astratte SymmetricAlgorithm, AsymmetricAlgorythm e HashAlgorithm, al secondo livello ci sono le classi astratte dei vari algoritmi (DES, MD5, SHA1 ecc..), mentre al terzo livello ci sono le ServiceProvider, una per ogni classe astratta di livello 2 (MD5CryptoServiceProvider, SHA1Managed ecc..). Gli algoritmi simmetrici usano la stessa chiave per criptare e decriptare il messaggio. Sono molto veloci sia a criptare che a decriptare. I più utilizzati sono DES, TripleDES, RC2 e Rijndael. La forza della cifratura dipende dalla lunghezza della chiave. I problemi principali derivati dall’uso di algoritmi a chiave simmetrica sono lo scambio della chiave (fase critica), gli attacchi brute-force e il management delle chiavi. Gli algoritmi asimmetrici usano chiavi diverse per criptare e decriptare. La chiave usata per criptare è la Public Key (va consegnata a chiunque intende inviarci materiale criptato), mentre la chiave privata è l’unica che può essere usata per la decriptazione. Gli algoritmi più utilizzati sono RSA e DSA. Il maggior difetto degli algoritmi a chiave asimmetrica è la lunghezza computazionale. Spesso per ovviare a questo problema si usa un algoritmo asimmetrico per scambiarsi la chiave pubblica, per poi utilizzare un algoritmo simmetrico (esempio di funzionamento di SSL). ASP.NET non dispone di un modulo automatico per cifrare la querystring, nel caso in cui ciò fosse necessario bisogna farlo manualmente (anche la parte di decriptazione va gestita manualmente).

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 16)

PARTE 5 – CAPITOLO 16 – AUTHORIZATION E ROLES

Dopo aver autenticato l’utente, è necessario analizzare i permessi che gli sono stati assegnati per determinare quali sono le azioni che può compiere. La più semplice strategia di autorizzazione è la URL Authorization: permette o nega l’accesso ad una risorsa utilizzando solo l’utente e l’URL relativa. Quando si applicano restrizioni particolari (ad esempio ad una cartella riservata solo ad un utente) bisogna specificare prima gli “allow” e poi i “deny” perché ASP.NET analizza tutte le proprietà di autorizzazione valide dal Top al Bottom e si ferma alla prima valida per il contesto corrente, ignorando quelle successive. Nel caso di root-subdirectory, le indicazioni per la subdirectory hanno priorità maggiore rispetto a quelle della root (un utente può essere autorizzato a vedere solo la root ma non una subdirectory). La scelta migliore è negare gli accessi agli anonimi (?), consentire l’allow a un gruppo ristretto e dichiarare un deny per tutti gli utenti subito dopo. Un’altra strategia di autorizzazione, utilizzata solo con la Windows Authentication, è la File Authorization (che controlla i permessi ACL sul file impostati grazie alle funzionalità del formato NTFS). Con le Authorization Checks in Code è possibile controllare le autorizzazioni prima di cercare di eseguire task particolari. Un primo esempio è il metodo User.IsInRole(“Ruolo”). Un’altra possibilità è la PrincipalPermission Class (si imposta – una volta sola – una regola e poi con un blocco try-catch si testa l’aderenza alla regola e si gestiscono le eccezioni). Due regole create con PrincipalPermission possono essere combinate in OR usando “(PrincipalPermission)pp1.Union(pp2)”. Le impostazioni di sicurezza fin qui introdotte funzionano solo con i tipi di file che possono essere gestiti direttamente da ASP.NET. L’accesso ad altri tipi di file (ad esempio una immagine GIF) bypassa completamente le impostazioni di sicurezza definite. Per ovviare al problema è necessario aggiungere un nuovo File Type Mapping a IIS. Dopo aver mappato l’estensione è necessario creare un custom HTTP handler (descrive come trattare il file) e aggiungere un riferimento nella sezionedel blocco. Il tipo di accesso all’interno di una applicazione web deve rimanere lo stesso. Quando l’applicazione è su più subdirectory, prima viene letta la parte di authorization del web config più indentato e poi si va a risalire. Appena viene trovata una regola che si applica la ricerca viene interrotta. Si può anche usare il tag location (fuori da system.web ma subito dentro configuration) per impostare i permessi di uno specifico file. Per gestire al meglio le Permission, gli Users sono spesso raggruppati in Roles. Con la Windows Authentication i Roles sono i gruppi di Windows (quelli di default o quelli aggiunti manualmente). La File Authorization, funzionante solo con Windows Authentication e basata su ACL, controlla se l’utente ha il permesso di leggere/eseguire una particolare risorsa. Tutti gli oggetti che ereditano da IPrincipal possono usare la IsInRole per controllare se un utente fa parte di un gruppo (o di un Windows Group – Nome macchina per i custom e BUILTIN per i default). Con PrincipalPermission e il metodo Demand() posso controllare se l’utente fa parte di un determinato gruppo e gestire gli scenari con un blocco try/catch (il metodo infatti solleva una eccezione se le credenziali non sono sufficienti). I roles possono essere dichiarati anche programmaticamente.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 15)

PARTE 5 – CAPITOLO 15 – WINDOWS AUTHENTICATION

La Windows Authentication, molto utilizzata nelle reti Intranet, ha lo scopo di mappare gli utenti di rete con quelli di sistema censiti in una macchina dedicata. Da questa sommaria definizione si capisce come questa strada sia percorribile solo quando il numero di utenti è limitato e comunque non ad iscrizione libera. A differenza della Forms Authentication, questo tipo di autenticazione non è gestita da ASP.NET ma direttamente da IIS che chiede al visitatore di inserire le credenziali di un utente di sistema. Il primo passo da parte del Web Server è verificare se la richiesta sia legittima (ad esempio si può limitare la richiesta alle sole postazioni di una Intranet) e in seguito verifica se le credenziali sono corrette. Solo a questo punto permette ad ASP.NET l’elaborazione della richiesta. Il passo successivo è verificare se l’utente sta utilizzando l’Impersonation (tecnica tramite la quale un utente cambia temporaneamente la sua identità per identificarsi con altre credenziali. In ASP.NET esistono due tipi di Impersonation: Configured – in web.config file, specifica che la richiesta va fatta con l’identità del richiedente – e Programmatic – cambia l’identità direttamente nel codice per svolgere un particolare task e torna all’identità originale terminato il task in questione). L’ultimo controllo riguarda i permessi NTFS per l’utente corrente. Se tutte le verifiche hanno esito positivo viene garantito l’accesso. Se ci si trova nella condizione di poterla utilizzare, la Windows Authentication è sicuramente una buona scelta in quanto permette di utilizzare l’infrastruttura già esistente ed evita di gestire la parte di codice dedicata. Naturalmente ci sono anche dei lati negativi come, ad esempio, l’inscindibilità di questa tecnica con il sistema operativo Microsoft Windows e la poca personalizzazione possibile riguardo alla gestione degli utenti. Le tre tipologie di accesso disponibili per la Windows Authentication sono la Basic (supportata da tutti i browser, invia i dati in chiaro), la Digest (trasmissione di un hash crittografato contenente i dati di accesso) e la Integrated (non vengono trasmessi i dati di accesso ma solo un Token legato all’utente correntemente loggato). Il processo di autenticazione può avvenire via NTLM o Kerberos (quando supportato). NTLM (NT Lan Manager) è l’autenticazione integrata in Windows. Un client fa una richiesta al Server, questo genera una Nonce (stringa casuale unica) che comunica al Client, il client fa loggare l’utente e crea l’hash per la password, con l’hash cripta il Nonce ricevuto e rispedisce tutto al Server che estrae le proprie informazioni sull’username e verifica che il Nonce criptato con la password dell’utente coincida con quello inviato dal client. Kerberos è il metodo di accesso più sicuro attualmente disponibile. Viene utilizzato di default da Windows se Client e Server usano Windows2000 (o successive edizioni) ed è disponibile un Active Directory Domain in rete. Il Browser invia una richiesta all’Authentication service con la Username dell’utente; il KDC legge la Master Key (hash della password relativa all’utente corrente); il KDC crea un TGT (Ticket Granting Ticket) che contiene una Session Key per l’utente e la relativa data di scadenza e lo stesso viene criptato con la Master Key e rimandato al client; solo inserendo la giusta password il client è in grado di decriptare correttamente il TGT e autenticarsi (a questo punto la TGT viene inserita in cache); per autorizzazioni successive si controlla se il TGT non è scaduto (e in ogni caso viene generata una nuova session criptata). Per utilizzare la Windows Authentication bisogna configurare il tipo di autenticazione da IIS, configurare ASP.NET in modo da utilizzare l’autenticazione di IIS (web.config) e negare l’accesso anonimo all’intera applicazione o ad una sua specifica area. In seguito basta abilitare i relativi moduli (sempre di IIS). Utilizzando la Windows Authentication è possibile forzare determinati overload sul metodo IsInRole che permettono di verificare se l’utente fa parte di un certo gruppo di dominio.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 14)

PARTE 5 – CAPITOLO 14 – FORMS AUTHENTICATION & MEMBERSHIP

La Forms Authentication permette un elevato grado di personalizzazione del processo di login. Questo può essere allo stesso tempo un fatto positivo (per via del maggiore controllo sulle operazioni) ma anche una fonte di problemi (bisogna implementare e testare personalmente le procedure implementate).
Bisognerebbe utilizzare la Forms Authentication solo se ci sono motivi validi per non utilizzare la Windows Authentication.
ASP.NET controlla, ogni volta che l’utente richiede una risorsa protetta, che abbia un token valido per accedervi. In caso negativo viene riportato alla pagina di loign.
Le caratteristiche positive della Forms Authentication sono il pieno controllo sul codice di autenticazione e sul rendering della pagina di login/errore, la compatibilità con tutti i browser e la possibilità di decidere come immagazzinare i dati degli utenti.
Di default i dati sugli utenti vengono immagazzinati nel file “web.config”, ma possono essere spostati anche in altri luoghi (ad esempio un database). In ogni caso è sempre utile criptare le password con un algoritmo tipo SHA1.
La Forms Authentication non richiede esplicitamente che l’applicazione web sia programmata in ASP.NET: è estensibile a qualsiasi linguaggio server a patto di configurare a dovere i relativi handler e il file di configurazione.
ASP.NET fornisce una utile struttura dati (in questo caso un database SQL Server) in cui memorizzare in modo semi-automatico le informazioni relative agli utenti.
La Membership è una API costruita sul concetto di Form Authentication che automatizza i processi di login (possibilità di creare/eliminare utenti, gestire il reset/generazione/recupero password, memorizzazione di dati personali ecc..).
Le Membership andrebbero dichiarate nel file web.config principale, in modo da influenzare tutta l’applicazione.
Il concetto che sta alla base della Membership è che il suo lavoro è completamente indipendente dal Data Store sottostante. Il fatto di scegliere le funzioni preconfigurate da ASP.NET ha come unica ragione la semplicità e l’immediatezza di utilizzo. In realtà questa struttura dati può essere completamente personalizzata se non addirittura riscritta (ad esempio per usare Oracle invece che SQL Server). Nel caso in cui si scegliesse di utilizzare e modificare la soluzione proposta dal Framework occorre sapere che tutti i metodi e le proprietà utili sono dichiarate in System.Web.Security.
Per usare una Membership i passi da seguire sono 5: impostare nel web.config la forms authentication e l’accesso negato per i visitatori anonimi, costruire la Membership Data Store (si può usare anche il tool di Microsoft), configurare il database e la stringa di connessione e il membership provider nel file web.config, creare/gestire utenti nella membership (anche tramite WAT), creare una pagina di login default/custom e gestire gli eventi derivati dal login stesso.
Nota: se si restringe l’accesso anonimo alla root del sito, anche i file esterni (come il foglio di stile CSS) non saranno scaricati. Bisogna aggiungere una all’interno del file web.config per consentire l’accesso alla particolare risorsa.
Usando (e modificando) le Stored Procedures messe a disposizione dal Framework è possibile creare velocemente le maschere di login, registrazione, recupero password, update ecc..
Per creare Membership personalizzate occorre ereditare da System.Web.Security.Membership-Provider.
A partire da Visual Studio 2005 ci sono due tipi di database: quelli classici, memorizzati su SqlServer e quelli file-based, che sono file in formato mdf memorizzati nella cartella App_data e che contengono al loro interno la struttura del db. Questi sono utili per piccole applicazioni (spesso per database Client Side su applicazioni standalone) mentre non sono adatti a web application su larga scala per via dei problemi di performance e per la scarsa gestione della concorrenza.
Il tool aspnet_regsql.exe permette di configurare la struttura per gestire le membership. Se viene lanciato (da console Visual Studio) senza parametri mostrerà un wizard.
Dopo la creazione delle tabelle per la gestione della membership bisogna inserire, nel web.config di root, la connection string nella sezione configuration > connection strings e la membership nella sezione nella system.web (ricordarsi poi di settare il default provider).
A partire da IIS 7 è possibile gestire molte delle caratteristiche delle membership direttamente dalla console di amministrazione del Web Server.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 13)

PARTE 5 – CAPITOLO 13 – MODELLO DI SICUREZZA

Ci sono alcune linee-guida da seguire per avere sin dai primi passi una applicazione più sicura:
– Non fidarsi degli input degli utenti, vanno tutti validati nel modo più restrittivo possibile
– Non usare la concatenazione per scrivere istruzioni SQL, bisogna usare la parametrizzazione per evitare SQL injections
– Non mostrare mai sulle pagine porzioni di codice inserite da un utente senza validarle, il rischio è quello di un attacco cross-site-scripting (ad esempio inserimento di codice javascrip dannoso). Per prevenire questo tipo di attacchi basta utilizzare il metodo HttpUtility.HtmlEncode() o il suo eguale Server.HtmlEncode().
– Non memorizzare dati sensibili utilizzando i campi hidden perché sono facilmente rintracciabili e modificabili
– Non memorizzare dati sensibili nel ViewState
– Abilitare SSL quando si utilizza la Basic Authentication o ASP.NET Forms Authentication (vale anche come regola generale se l’applicazione web tratta dati particolarmente sensibili)
– Proteggere i cookie e impostare la loro data di scadenza nel modo più restrittivo possibile
La politica di programmazione a “GateKeeper” permette di avere più barriere in serie (alcune implementate a livello di linguaggio, altre a livello di CLR, altre ancora a livello di Web Server, sistema operativo o altro ancora) contro un eventuale attacco informatico prima di raggiungere il dato vero e proprio.
Nel contesto della sicurezza informatica i concetti chiave (e, quindi, alcuni dei livelli del metodo a GateKeeper) sono Authentication, Authorization, Confidentiality e Integrity.
Authentication è il processo in cui si ottiene l’identità dell’utente corrente e si testa la veridicità di tale informazione. In ASP.NET ci sono quattro possibilità di implementazione: Windows Authentication (SID di 96 bit), Forms Authentication, Passaport Authentication (non più utilizzata) e Custom Authentication.
Authorization è il processo di verificare/determinare permessi e restrizioni assegnate ad un utente autenticato.
Confidentiality è una politica che si assicura che i dati non vengano visualizzati da utenti non autorizzati mentre sono trasmessi in rete o memorizzati in un DataStore.
Integrity è una politica che si assicura che i dati non vengano modificati mentre sono trasmessi in rete o memotizzati in una DataStore.
Confidentiality e Integrity si basano sull’Encryption dei dati. Si tratta di una procedura messa in atto per rendere i dati completamente illeggibili da chi non è autorizzato (da chi non possiede la chiave di decodifica).
IIS offre un primo livello di sicurezza fornendo opzioni di autenticazione, autorizzazione (tramite Access Control Lists) e riservatezza (con SSL).
Impersonation è la politica di eseguire un task con un utente differente rispetto a quello di default (uso tipico nelle web farm per differenziare gli utenti dei vari siti web ospitati).
Dato che il tag è disponibile solo nel web.config della cartella principale, è possibile inserire un solo tipo di autenticazione per applicazione (anche se possono esserci regole diverse in ogni sottocartella).
IIS 7.0 offre anche opzioni di autorizzazione role-based e IP-based.
In genere una richiesta di accesso parte da un utente che viene considerato anonimo, il sistema non lo riconosce e gli chiede di autenticarsi. In base al tipo di autenticazione sviluppata le credenziali vengono verificate da ASP.NET o da IIS. Se non ci sono riscontri viene chiesto all’utente di re-inserire le credenziali, mentre se l’utente viene riconosciuto il sistema verifica che abbia i permessi per accedere alla destinazione richiesta. In caso positivo viene garantito l’accesso, mentre in caso negativo viene mostrato un messaggio di “Accesso Negato”.
La prima barriera che si pone tra l’utente e la risorsa protetta è IIS. Per quanto riguarda l’autenticazione, IIS supporta la Basic, la Digest, la Passport, la Windows e la certificazione. Tutte le autenticazioni portano il visitatore ad “impersonare” in un utente Windows autenticato. Dopo questo passo IIS supporta solo l’autenticazione di utenti Windows. Per quanto riguarda l’autorizzazione, IIS supporta la restrizione IP e la valutazione di Windows ACLs (Access Control Lists, il modo di Windows per proteggere risorse gestita dal sistema operativo stesso). SSL viene utilizzato per garantire la riservatezza.
Secure Sockets Layer è una tecnologia che permette di cifrare le comunicazioni basate su http. Non ci sono differenze di programmazione ma solo di porte (tipicamente la 443) e di protocollo (https). Affinché un Server supporti SSL è necessario che abbia acquistato un certificato X.509, che lo abbia installato e che abbia configurato il WebServer a dovere.
Lo standard industriale dei certificati (X.509v3) richiede come parametri il nome del proprietario, della sua organizzazione e il suo indirizzo, la chiave pubblica del proprietario, il periodo di validità del certificato e il suo numero seriale.
La cifratura asimmetrica si basa sul concetto che un messaggio cifrato con una chiave pubblica (dal client) sia decifrabile solo da chi è in possesso della chiave privata abbinata (tipicamente il server). Il principio che sta alla base della cifratura asimmetrica è che trovare la chiave privata partendo dalla chiave pubblica è computazionalmente quasi impossibile (in linea teorica è meno costoso cercare di craccare il messaggio con un attacco di forza bruta che risalire alla chiave privata).
SSL combina tecniche di cifratura simmetrica (stessa chiave) e asimmetrica: la chiave per la cifratura simmetrica (generata randomly dal client per ogni sessione) viene scambiata utilizzando la cifratura asimmetrica (il client ottiene la chiave pubblica del server dal certificato).
ASP.NET e IIS implementano la tecnica dei GateKeepers per rendere più sicuro l’accesso ad una risorsa protetta.
I metodi di autenticazione offerti da ASP.NET sono memorizzati nella sezione “authentication” del file web.config. Le modalità disponibili sono Forms (per utilizzare le maschere di login personalizzate), Windows (per usare l’autenticazione del SO) e Passport (ora deprecato a favore di LiveID). Dopo aver autenticato l’utente i suoi dati sono disponibili nella variabile HttpContext.Current.User.
I metodi di autorizzazione (sezione “authorization” del file web.config) sono UrlAuthorization (allow/deny in base al nome utente o al gruppo di appartenenza) e FileAuthorization (Windows ACLs).
A prescindere dalla tipologia di accesso, gli utenti loggati vengono forniti di “principal” e “identity”. L’oggetto “identity” rappresenta l’utente in sé, mentre l’oggetto “principal” rappresenta il contesto di sicurezza corrente (identity e informazioni sull’utente memorizzate).

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 12)

PARTE 4 – CAPITOLO 12 – SVILUPPO DI UN SITO

Sviluppare contenuti riusabili è certamente una buona metodologia di lavoro in quanto permette di velocizzare la programmazione e di settorializzare ed isolare eventuali errori di codice e/o design.
Lo strumento più semplice per creare porzioni di pagina riutilizzabili è probabilmente lo User Control. Gli User Control (file caratterizzati dall’estensione ascx) sono piccole sezioni di pagina che possono includere pezzi di codice statico HTML e controlli lato web-server. Il vantaggio, come già detto, è che una volta creato può essere utilizzato in più pagine.
Le differenze tra una UC e una pagina sono che la prima inizia con la direttiva Control (e non Page) e che non può essere richiamata direttamente da un Client ma sono incluse in altre pagine.
Una UC è in grado di fornire un Partial Caching, ovvero una copia cachata dei propri dati. Per dichiarare un Partial Caching bisogna aggiungere la stringa [PartialCaching(time)] prima della classe che si vuole memorizzare.
Gli UC vanno registrati nelle pagine che li usano con
Le comunicazioni tra pagine e UC possono essere fatte con metodi e proprietà pubblici oppure utilizzando gli eventi e i delegati:
Nella pagina padre faccio l’override del metodo OnInit() con protected override void OnInit(EventArgs e) { base.OnInit(e); ManageUser.Back += new EventHandler(UCManage_Back); } in cui aggancio l’evento. Poi nella pagina madre definisco la funzione UCManage_Back. Nello UC definisco try { Back(sender, e); } catch (Exception ex) { // } sempre nello UC definisco public event System.EventHandler Back;
Se invece voglio usare I delegate per passare valori, nello User Control (classe C1 e id ID1) dichiaro public event OnButtonClick btnHandler; protected void btnTest_Click(object sender, EventArgs e) { if (btnHandler != null) btnHandler(“hey”); } nella pagina invece ID1.btnHandler += new C1.OnButtonClick(WebUserControl1_btnHandler); void WebUserControl1_btnHandler(string strValue) { lbl.Text = strValue; }
I controlli costituenti di uno User Control sono accessibili solo dallo stesso. Affinché siano visibili e/o modificabili dall’esterno occorre implementare i relativi metodi pubblici.
Un altro controllo che può venire in aiuto dello sviluppatore è il MultiView: con il MultiView Control è possibile racchiudere in una sola pagina tutti i passaggi che generalmente vengono effettuati su pagine separate (Stepped Page).
Con WizardControl è possibile creare MultiView che mostrino visualmente tutti i passi con la possibilità di scegliere il passo desiderato.
Con altri particolari controlli (che vanno ben oltre gli scopi di questa mini guida) È possibile anche generare sitemap e visualizzazioni con TreeMap e Menu-Style.
Una volta completata l’applicazione web è necessario pubblicarla affinché sia accessibile dagli utenti. Occorre quindi installare su una macchina collegata ad Internet/Intranet mediante un IP fisso un Web Server capace di gestire una applicazione ASP.NET. La scelta più naturale cade ovviamente su IIS di Microsoft, già integrato in tutte le più recenti versioni di Windows (anche se nelle edizioni Client va abilitato manualmente).
Internet Information System è un programma sviluppato da Microsoft per rendere accessibile in rete (sotto una virtual directory) una cartella fisicamente presente sull’hard disk del Server. Il WWW Publishing Service è responsabile di gestire il traffico ricevuto su porte particolari (tipicamente 80 e 443).
A partire dalla sesta versione (distribuita con Windows Server 2003 e consistente in una vera e propria riscrittura completa) il programma è stato estremamente modularizzato, introducendo ad esempio il modulo http.sys e permettendo di gestire ogni richiesta in modo separato.
Con la configurazione multi-IP (se ci sono più network adapter) si possono differenziare le richieste in base all’IP. Ovviamente una porta può essere utilizzata una volta sola da un IP, mentre IP diversi possono condividere la stessa porta.
Le configurazioni del Server vengono memorizzate nel file system.webServer e in una Central Configuration.
Il modulo ISAPI si preoccupa di gestire i file richiamati nell’URL in base alla loro estensione (ad esempio i file aspx vengono delegati al .NET Framework, mentre le pagina HTML vengono renderizzate direttamente dal browser).
Gli Alias sono i nomi che un client remoti userà per accedere ai files in una virtual directory.
La Directory è la cartella fisica sull’hard disk (del server) che viene esposta come Virtual Directory.
Le Permission sono le impostazioni di sicurezza impostate per un elemento. Read permette di accedere ad un oggetto in sola lettura, Run Script permette all’utente di richiedere una pagina ASP e/o ASP.NET. Senza questa impostazione gli utenti sono limitati a visualizzare solo pagine statiche (come ad esempio le pagine HTML), Execute permette di lanciare un eseguibile o una applicazione CGI, Write permette di gestire i files sul file system del web server, Browse permette di ottenere una lista dei contenuti di una directory.
È possibile assegnare ad una pagina (ad esempio una pagina ASP.NET in formato aspx) una estensione personalizzata (ad esempio *.mypage) aggiungendo un relativo handler nella sezione handlers del file di configurazione.
La separazione in moduli e handler è utile per modularizzare e risparmiare risorse. IIS opera di default in Integrated Mode: la Request Processing Pipeline include sia i moduli nativi sia gli handler scritti in c/c++ che i moduli/handler in .NET.
La Classic Mode è una modalità introdotta per il supporto backward con IIS6.
L’isolamento delle applicazioni avviene attraverso l’uso di Application Domains (meccanismi CLR per isolare componenti .net che girano nello stesso Host Process).
Le identità sono diverse per ogni Worker Process tramite Application Pools (ad esempio gestione di differenti credenziali). Le Web Applications sono associate agli AP, ogni AP è un WP per riflettere IIS5 in IIS6.
In IIS7 la gestione dell’handling è costruita su quella di IIS6.
Riciclare un Application Pool significa stoppare tutte le istanze correntemente in corso e riavviare il WP.
Identity di un AP: Network Service ha permessi limitati rispetto a Local System Account. Utile quando l’applicazione deve essere gestita dall’esterno. Local service è ancora più restrittivo, non può usare altre risorse di rete. Local System è il più potente e può fare tutto. Sennò si può creare un utente in Windows, assegnargli i permessi e creare un nuovo Application Pool che rifletta i permessi di questo utente.
A questo punto, per pubblicare la applicazione web, basta copiare tutti i file in nella Virtual Directory e controllare se gli assembly corretti sono installati in GAC (in alternativa occorre installarli con GACUTIL o assicurarsi che sia generata una copia nella cartella bin). L’ultimo passo è ovviamente quello di creare e configurare i database così come verificare la corretta configurazione di ASP.NET e IIS. Di solito è necessario anche modificare alcuni parametri nei file di configurazione.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 11)

PARTE 4 – CAPITOLO 11 – CUSTOMIZZAZIONE DI PAGINE E CONTROLLI

Cascading Style Sheets (CSS) è un linguaggio nato per standardizzare lo stile degli oggetti all’interno delle pagine web. Non è quindi un concetto nato con ASP.NET ma applicabile a tutte le pagine internet indipendentemente dal linguaggio con cui sono state programmate. Il modo più rapido per usare questo linguaggio è quello di dichiarare le regole direttamente all’interno della dichiarazione dell’oggetto che devono regolare. Un foglio (esterno) di stile consiste invece in un insieme di regole (divise in regole per le entità, regole per le classi e regole per gli identificativi) posizionato in una (sotto)directory di una applicazione ed incluso nelle sue pagine.
In aggiunta al linguaggio CSS ASP.NET fornisce un completo sistema per creare pagine con un layout comune. I temi di ASP.NET servono in particolare per supplire alle funzioni che CSS non può offrire (ad esempio la customizzazione dell’oggetto Calendar e dei Rich Control in generale). Si tratta di file con estensione skin memorizzati nella virtual directory “App_Themes” che contengono definizioni di stile per una serie di controlli. Il tema va poi aggiunto alla pagina con il parametro “Theme” nella direttiva .
Le Master Pages sono invece pagine che definiscono una parte del layout che deve rimanere uguale in tutte le pagine della web application (ad esempio le classeche sezioni header e footer). Ogni pagina che intende usare la Master Page dovrà avere l’attributo MasterPageFile settato in modo corretto nella dichiarazione dell’attributo .
Tipicamente la gestione del contenuto avviene tramite i ContentPlaceHolder: nella Master Page si definiscono tanti ContenPlaceHolder quante sezioni “varianti” si pensano di inserire (ad esempio un menù e il contenuto vero e proprio). Nelle pagine basterà inserire l’appropriato codice ASP.NET all’interno di controlli Content definiti ad-hoc in cui indicare in quale ContenPlaceHolder della MasterPage renderizzare il contenuto.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 10)

PARTE 4 – CAPITOLO 10 – LE PARTI DI UN SITO

Le applicazioni .NET (almeno quelle installate in un ambiente di produzione) vengono gestite da un Web Server, tipicamente Microsoft IIS. In questo caso ogni applicazione è eseguita all’interno di una Virtual Directory e sotto un diverso Application Domain, per assicurarsi che non vi siano pericolose “condivisioni” di risorse (dato che il disco fisico su cui sono installate le diverse applicazioni è lo stesso).

All’interno di ogni Virtual Directory la struttura delle applicazioni web è molto simile: esisterà un file chiamato Global.asax utile per reagire ad eventi globali rispetto all’applicazione e una lista comune di cartelle: bin (contiene assembly precaricati e dell’applicazione), App_Code (contiene assembly caricati dinamicamente – le classi definite dall’utente), App_Data(contiene database mdf, file xml ecc..), App_GlobalResources (contiene le risorse che devono essere accessibili da tutta l’applicazione), APP_LocalResources (contiene le risorse che devono essere accessibili da una specifica pagina), App_Webreferences (contiene riferimenti ai web-services), App_Browser (contiene informazioni sul browser in uso), App_Themes (contiene informazioni sul tema in uso).
Come già anticipato è possibile inserire un componente esterno includendo la sua definizione nelle pagina che intendono utilizzarlo.
Nel file di macchina machine.config (comune a tutte le applicazioni su un Web Server) sono definiti parametri di base, limiti architetturali e di congestione e machine-key per criptare i dati.
Nella cartella root di ogni applicazione è poi presente un file Web.Config che sovrascrive parti del Machine.Config impostando proprietà dettagliate per l’applicazione corrente. Scendendo di livello, ogni sottocartella può contenere un file Web.Config che si preoccupa di rifinire le impostazioni dell’applicazione. Non tutte le impostazioni possono essere ridefinite dai file di configurazione dei livelli “inferiori”.
A livello di applicazione e di sessione, gli eventi che possono essere scatenati sono quelli di ApplicationStart, SessionStart, ApplicationError, SessionEnd, ApplicationEnd, ApplicationDispose.
A livello di pagina invece il processo di caricamento è scandito dagli eventi BeginRequest > AuthenticateRequest > AuthorizeRequest > ResolveRequestCache > AcquireRequestState > PreRequestHandlerExecute > HTTP HANDLER > PostRequestHandlerExecute > Release Request State > UpdateRequestCache > End Request.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 9)

PARTE 3 – CAPITOLO 9 – RICH DATA CONTROLS

I RDC sono i componenti che più sono cambiati durante lo sviluppo del .NET Framework.
La GridView, già presentata qualche capitolo addietro, è una griglia molto flessibile per visualizzare i dati in una semplice tabella fatta di righe e colonne. Include molte caratteristiche come la selezione, la paginazione, l’ordinamento e la modifica (estendibili con i templates). La grande novità di GridView (rispetto al vecchio DataGrid) è il suo supporto agli scenari Code-free. Per avere un maggior controllo sulla definizione delle Colonne è necessario settare il parametro AutoGenerateColumns a “false” e definire manualmente le impostazioni nella sezione “<Columns>” del control tag della GridView. È possibile customizzare molti aspetti delle colonne usando i relativi comandi. È inoltre disponibile il comando “AutoFormat” per modificare l’aspetto di una GridView tramite una interfaccia grafica DataFormatString={0,XXX} serve per formattare correttamente le stringhe. È possibile usare la Row Selection per selezionare una particolare riga e l’evento SelectedIndexChanged per mostrare i dettagli. È possibile legare due GridView insieme (tipicamente generale/dettaglio) usando SelectedItem e DataKeyNames. Per utilizzare una riga già esistente come un link per la Row Selection basta aggiungere l’attributo ButtonField e impostare DataTextField al campo di riferimento (tipicamente l’ID). È possibile usare una colonna per ordinare i campi con l’attributo SortExpression e impostarlo con un campo. Se si fa un ordinamento mentre c’è una riga selezionata questa non viene mantenuta in memoria (alla fine del sorting verrà evidenziata una nuova riga con lo stesso id della precedente). Per ovviare al problema bisogna “ripulire” la selection per poi riapplicarla alla fine (memorizzando il valore della riga da selezionare). È possibile anche compiere sorting avanzati composti da due o più campi. Il metodo statico Eval() permette di ottenere automaticamente i dati della riga corrente, usando la reflection per trovare il field corretto.
La ListView (nuovo controllo introdotto nella versione 3.5 del Framework) è un componente estremamente flessibile capace di “rendere” il suo contenuto basandosi sul template definito. Con GroupItemCount posso “allineare” le tabelle in base ad un numero di valori per riga predefiniti. È possibile usare il Paging anche con questo componente.
DetailsView e FormView sono componenti sviluppati con lo scopo di visualizzare un particolare e singolo record di una lista. Supportano pulsanti di navigazione per passare da un record all’altro. Entrambi supportano i templates (la FormView li richiede necessariamente). Un’altra differenza tra i due componenti è che DV mostra i dati in una tabella, mentre la FV permette di gestire con più flessibilità la rappresentazione dei dati.
La DetailsView mostra i valori degli attributi dell’oggetto su righe separate. I nomi dei campi vengono ottenuti grazie alla reflection, ma possono essere editati nel campo “<Field></Field>” usando BoundField. Sono supportate le azioni di Delete, Insert e Edit, ma non vengono gestiti tramite i controlli ma grazie alle proprietà AutogenerateEditButton.
La FormView rispetta il modello TemplateField della GridView e permette di aggiungere (come la DV) i bottoni per i comandi SQL.
Entrambi i componenti possono operare in Read-Only, Insert e Edit mode.
Usando BinaryWrite() è possibile (anche se spesso non è conveniente) prelevare dati binari (tipicamente una immagine) da database.

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook

HowTo – Guida ASP.NET (Parte 8)

PARTE 3 – CAPITOLO 8 – LINQ

LINQ (acronimo di Language INtegrated Query) è un set di estensioni del linguaggio che permettono di effettuare query su diversi tipi di entità senza abbandonare il linguaggio C# ed i suoi costrutti.
Esistono diverse estensioni per gestire differenti componenti: LINQ to Object (query su collection di oggetti in memoria come, ad esempio, le liste), LINQ to DataSet (query su collection di DataSet in memoria), LINQ to SQL (interroga un SQL Server senza scrivere Data Access Code), LINQ to XML (manipola XML senza usare le classi ed i metodi dedicati).
LINQ-To-Object (forse il tipo più usato insieme a LINQ-To-SQL) è utile per sostituire i cicli (tipicamente i foreach) sugli oggetti in memoria (ad esempio su una lista). Come viene indicato subito sotto è necessario memorizzare i risultati di una query LINQ in un oggetto di tipo IEnumerable.
Di norma si crea una variabile di tipo IEnumerable (in generale IEnumerable) e si lancia la query nella forma var = from CAMPO in TABELLA where CAMPO.METODO.SOTTOMETODO() select CAMPO (più eventuali proiezioni).
Nella SELECT è possibile rinominare i campi con SELECT NEW {NEWNAME = CAMPO (più eventuali sottocampi)}.
È possibile ordinare i valori ottenuti aggiungendo la direttiva orderby dopo la FROM e prima della SELECT. È oltretutto possibile, nel caso si utilizzi una entità come sorgente, selezionare solamente alcune proprietà con Entità.Proprietà (ad esempio employee.FirstName + employee.LastName). Riepilogando è possibile procedere con una Anonymous Class o con una Entità definita: con var (non posso definire un IEnumerable in questo caso) matches = from employee in employees select new {First = employee.FirstName, Last = employee.LastName} creo una nuova anonymous class che contiene I parametric First e Last e che può essere usata localmente e/o per un binding (foreach employee {…First, Last…}). Se definissi una classe con First e Last potrei usare IEnumerable matches = from employee in employees select new EmployeeName {FirstName = employee.FirstName, LastName = employee.LastName}.
Le clausole where possono essere dichiarate inline, prima della select, oppure tramite un metodo (ad esempio private bool TestEmployee(EmployeeDetails employee) { return employee.LastName.StartsWith(“D”) }) da inserire poi in matches = from employee in employees where TestEmployee(employee) select employee;
È possibile raggruppare i valori ottenuti aggiungendo la direttiva group CAMPO by CAMPO.PROPRIETA dopo la FROM e prima della SELECT (di solito i gruppi così creati hanno alias “g”).
L’ordinamento si effettua con una o più “orderby” separate da virgola prima della “select” (se l’oggetto implementa IComparable).

LINQ mette in atto la Deferred Execution: gli operatori vengono eseguiti non durante la loro costruzione ma nel momento in cui vengono enumerati (tipicamente con il costrutto ToList()).
Gli Extension Methods vengono utilizzati quando si richiamano proprietà direttamente sugli oggetti LINQ invece che sugli oggetti C# (ad esempio il .Count()).
Un Extension Method deve essere statico e come primo parametro deve accettare una referenza all’oggetto su cui viene chiamato (preceduto da this).
Le nuove versioni di Microsoft .NET Framework permettono di eseguire anche “Lambda Expressions”, ovvero query LINQ nella forma matches = employees.Select(employee => employee).
In generale le Lambda Expressions permettono di aggiungere parametri con (p => p.UnitPrice). employee => employee (il primo è la referenza all’oggetto, il secondo è ciò che viene fatto su ogni elemento o valore di ritorno).
Quando uso LINQ-To-DataSet devo usare l’Extension Method dataRow.Field(“FirstName”); per ovviare al problema dei dati non tipizzati del dataset. Inoltre devo implementare l’Extension Method “AsEnumerable” sugli oggetti datatable per renderli IENumerable-compatibili.
Per rendere possibile il Data Bind occorre dichiarare var matches = from employee in s.Tables[“Employees”].AsEnumerable() where employee.Field(“LastName”).StartsWith(“D”) select employee; gridEmployees.DataSource = matches.AsDataView(); gridEmployees.DataBind().
LINQ-To-(Sql)Server: traduce istruzioni LINQ in istruzioni SQL Server. In generale non offre alcuna feature che non sia disponibile anche con ADO.NET, ma si scrive meno codice, si usa la stessa sintassi su più entità e si possono batchare le istruzioni.
È necessario creare gli attributi tables e columns nella classe in cui si vogliono mappare gli elementi. [Table(Name=”Employees”)] public class EmployeeDetails { [Column(IsPrimaryKey=true)] public int EmployeeID { get; set; } public EmployeeDetails(int employeeID, string firstName, string lastName, string titleOfCourtesy) { EmployeeID = employeeID; FirstName = firstName; LastName = lastName; TitleOfCourtesy = titleOfCourtesy; } public EmployeeDetails(){} }
DataContext è la classe che si preoccupa di effettuare il fetch dei dati dal DB all’oggetto al momento dell’enumerazione.
Non tutta la sintassi di LINQ ha corrispondenze con SQL. In questo caso si ottengono i dati con LINQ To Sql e poi si effettuano le query con LINQ To Object (occorre dichiarare un cast per le “table” da IQueriable a IEnumerable con ASEnumerable()).
Con .Single() o SingleOrDefault() è possibile ricercare una particolare tupla (o ricevere un valore nullo).
EntitySet permette di definire le associazioni [Association(Storage=”orders”, OtherKey=”CustomerID”, ThisKey=”CustomerID”)] che vanno dichiarate prima del costruttore.
Per forzare il load immediato dei dati bisogna settare l’opzione LoadOptions del DataContext.
Con AssociateWith è possibile associare una entità ad un’altra, di solito per filtrare una query (esempio: clienti con ordini superiori a…).
Di default quando viene chiamato un “submitchanges” su un oggetto dopo averlo modificato in-memory, questa operazione viene eseguita in transazione, annullando tutto se si verifica anche un solo errore. Inserimento e aggiornamento si effettuano con “insertonupdate” e “deleteonupdate”. Il cambiamento di eventuali relazioni viene fatto in automatico.
Per gestire la concorrenza esistono 4 modi e sono gli stessi già visti in altre occasioni: match-all-value (attributo di colonna >> UpdtateCheck = always), match-timestamp (proprietà timestamp), last-in-wins (UpdateCheck = never) e merge (updatecheck = WhenChanged).
Usando LinqDataSource posso automatizzare la maggior parte dei processi legati all’allineamento con il DB.
Posso poi mostrare i dati in un “<asp:TemplateField HeaderText=”# Linked Territories”>  <ItemTemplate> <%# Eval(“EmployeeTerritories.Count”) %> </ItemTemplate></asp:TemplateField>”.
Il modello DBML offre tre possibilità per effettuare la validazione: quando si setta una proprietà (ONXXXChanging), quando si inviano i dati (OnValidate) o in risposta a specifiche operazioni di aggiornamento.

[Omnia / Luca Zaccaro]

  • Share on OkNotizie
  • Share on Twitter
  • Share on Facebook