Applicazioni Web con ASP.NET Silvano Coriani ([email protected]) Academic Developer Evangelist Developer & Platform Evangelism Microsoft Microsoft Certified Microsoft Certified Microsoft Certified Microsoft Certified Microsoft Certified Trainer Solution Developer Application Developer System Engineer + Internet DataBase Administrator Agenda • Recall • HTML • Applicazioni Web dinamiche • • • • • • Architettura di ASP.NET Web Form (Web Control) La libreria System.Web.UI Code-Behind Data Binding ASP.NET Security Protocolli • TCP/IP • Protocollo utilizzato per tutte le comunicazioni su Internet • Protocollo a due livelli: TCP e IP • Hypertext Transfer Protocol (HTTP) • • • • Protocollo per lo scambio di file Utilizzato dai browser per accedere alle risorse Si basa su TCP/IP E’ Stateless Request/Response Http Server Client IIS/Apache Richiesta HTTP default.htm Risposta HTTP Markup Language • Hypertext Markup Language (HTML) • Creazione di pagine Web • Si basa su tag che il browser interpreta per visualizzare il contenuto • Dynamic HTML • Client-side • Consente di manipolare la pagina sul client • Extensible Markup Language (XML) • Definizione entità generiche • Utilizzato per lo scambio di dati Web Browser Diversi Browser Internet Explorer 5.x 6.x Internet Explorer 4.x Netscape Navigator 4.x Netscape Navigator 3.x Microsoft WebTV ActiveX VBScript DHTML Controls JavaScript Java Applets CSS 2.0 XML Tag HTML <p>Ciao Ciao</p> <br> <font color=red>Testo</font> • • • • Contenuti in un file di testo Memorizzati su un Server Richiesti via Http dal browser Interpretati sul client ASP.NET: flusso dell’applicazione Server Client IIS http://www.dcc.com/equipment/catalog_type.asp? ProductType=rock+shoes Richiesta HTTP ASP engine Risposta HTTP Esecuzione ADO Recupero risultati JScript VB Script default.asp Response Object • Consente di gestire la risposta Http <% Response.Write(“Ciao”)%> Invio dati dal browser al server <FORM action=“NomePagina” method=“XXX”> <INPUT TYPE=“Text” NAME=“txtNome”> <INPUT TYPE=“Text” NAME=“txtCognome”> <INPUT TYPE=“Submit”> </FORM> • Le informazioni vengono inviate a “NomePagina” sotto forma di stringhe • GET • txtNome=xxxx&txtCognome=yyyy • POST • Come header HTTP • GET o POST? Request Object • Contiene le info del QueryString <% nome=Request.QueryString("txtNome")%> <% nome=Request.QueryString(“txtNome”) cognome =Request.QueryString(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%> Request Object • Contiene le info del Form <% nome=Request.Form("txtNome")%> <% nome=Request.Form(“txtNome”) cognome =Request.Form(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%> Stateless • Ogni richiesta è a se stante • Non esistono informazioni di stato in HTTP • Per ogni richiesta dobbiamo preoccuparci di inviare il contenuto • Ad esempio riempire i campi di un form con le informazioni digitate dall’utente • Es. ripresentare le informazioni digitate <INPUT TYPE=“TEXT” NAME=“txtNome” VALUE=<%=Request.QueryString(“txtNome”)%> > ASP 3.0: the good • Modello di programmazione semplice • Utilizzo di normali editor HTML • Possibilità di modificare i sorgenti in ogni momento • Produzione di qualunque contenuto in risposta • Nessuna forzatura per lo sviluppatore • Utilizzo di nuove tecnolgie HTML 4 / CSS • Apertura verso altre tecnologie XML / XSLT ASP 3.0: The bad • Solo codice script • Povertà di linguaggio • Utilizzo limitato di librerie • Lentezza in esecuzione (relativa) • • • • • Sorgenti non protetti dall’infrastruttura Overlap fra codice e HTML Debug e gestione errori Non abbiamo oggetti, solo stringhe Scrivere codice per qualsiasi cosa • Mantenere lo stato dei campi • Validazione client e server differenti • Output differente IE / NS / Device • Nessuna interazione con il SO • IIS/W2K per settaggi applicativi Soluzione • ASP.NET • Linguaggio potente (VB, C#) • Compilazione • Automatica • E modifiche del codice sempre ammesse • Web Form e Controlli • Proprietà, Metodi, Eventi • Le pagine sono classi • Debug e gestione errori completa • Web.config per settaggi applicativi • Web Service integrati • Separazione fra codice e HTML (Code Behind) ASP.NET Framework • Piattaforma nella piattaforma • Facilita la costruzione di applicazioni serverside • Basate su HTTP, HTML, XML e SOAP • Processa richiesta HTTP • E fornisce risposte HTTP • Il web è sempre lo stesso ASP.NET Page Framework C# VB.NET J# J# Common language specification (CLS) Web Forms Windows Forms XML Web Services ADO.NET e XML .NET Framework classes Common Language Runtime (CLR) Windows COM + Services Visual Studio .NET ASP.NET ASP.NET Web Form <FORM action=“NomeRisorsa” METHOD=“POST”> <INPUT TYPE=“Text” ID=“txtNome” runat=“server”> <INPUT TYPE=“Text” ID=“txtCognome” runat=“server”> <INPUT TYPE=“Submit”> </FORM> • I controlli mantengono lo stato Dynamic Compilation Parsing ASPX Generazione Engine Request ASPX File Request Response Response Creazione Istanza Class File su Disco Page Class Istanza, Esecuzione e Rendering Codebehind file ASP.NET Internals (IIS 5 – Win 2000) HTTP Request .ASPX .ASMX .ASHX .DISCO .SOAP ISAPI Extension Manager •ASP.NET non usa ISAPI/ASP •ISAPI extension redirige le richieste sul worker process ASP.DLL ASPNET_ISAPI.DLL INETINFO.exe Named Pipe ASP.NET Pipeline ASPNET_WP.EXE Worker Process ASP.NET Internals (IIS 6 – Win 2003) Process Mgr metabase WWW Service Config Mgr INETINFO Application Pool 1 Application Pool 2 Web Garden W3WP.exe W3WP.exe W3WP.exe ASP.NET ISAPI ISAPI Extensions (ASP, etc.) ASP.NET ISAPI CLR Application Domain CLR Application Domain HTTP.sys ISAPI Filters CLR Application Domain CLR Application Domain ASP.NET Internals • Le richieste sono processate nella pipeline all’interno del worker thread • La pipeline contiene classi HttpRuntime • I moduli sono interceptor opzionali • HttpContext è la classe accessibile nella pipeline ASP.NET worker thread 1 HttpRuntime Class Modulo 1 Modulo 2 HTTP Handler Pagina1.aspx ASP.NET worker thread 2 HttpRuntime Class Modulo 1 Modulo 2 ASPNET_WP.EXE HTTP Handler Pagina2.aspx HttpContext Property TYPE Name Descrizione HttpContext Current Contesto corrente HttpRequest Request Richiesta Http HttpResponse Response Risposta Http HttpServerUtility Server URL Cracking HttpSessionState Session Sessione per client HttpApplicationState Application Property Bag applicativa HttpApplication ApplicationInstance Contesto Applicativo IHttpHandler Handler Handler della chiamata IDictionary Items Property Bag per richiesta Exception Error Primo errore incontrato IPrincipal User Security ID del chiamante Compilazione automatica • Supporto per la compilazione del sorgente just-in-time • Auto compilazione per .aspx .ascx .asmx .ashx • L’assembly generato viene memorizzato in una directory dietro le quinte • Reference automatica agli assembly comuni • Gli altri assembly sono referenziabili con direttive nella pagina • Shadow-copying per DLL (sovrascrivibili) System.Web.UI.Page • • • • Classe da cui vengono ereditati i file .aspx Si possono costruire variabili membro HTML diventa parte del metodo Render Il codice di rendering diventa parte del metodo Render • WebForm e Controlli Server-side sono costruiti sulla classe Page Direttive • A livello di pagina • @Page controlla la compilazione • Molti attributi • @Assembly per referenziare un assembly esterno • Come /r nei compilatori VBC.exe e CSC.exe • @Import per importare un namespace • Imports di VB.NET • using di C#; @Page ElencoCorsi.aspx <%@Page Language=“VB” Explicit=“True” %> <%@Assembly name=“GestioneCorsi” %> Codice VB (uno solo per pagina) <%@Import namespace=“Corsi” %> Dichiarazione variabili obbligatoria (abilitare sempre) ---codice--Referenzia l’Assembly GestioneCorsi.dll Queste direttive corrispondono a Vbc.exe /optionexplicit+ /r:GestioneCorsi.dll ElencoCorsi_aspx Direttive per @Page Language Linguaggio utilizzato Buffer Response Buffering True/False ContentType Header Content Type MIME EnableSessionState Session True/False EnableViewState ViewState True/False Src File sorgente per code-behind Inherits Base Class diverse da Page ErrorPage URL per eccezioni non gestite Explicit Option Explicit True/False Strict Option Strict True/False Debug Compilazione con simboli True/False Trace Tracing True/False CompilerOptions Switch per VBC.exe o CSC.exe Code Behind • Code behind • File separato per il codice • Compilazione automatica • @Page Src=“Codice.vb/cs” Inhrerits=“Classe” • Nel file Codice.vb • Public class Classe • Inherits System.Web.UI.Page • Poi il codice da usare con la pagina • Eventi • Funzioni • Visual Studio .aspx.vb | .aspx.cs Ereditarietà • Il Code Behind non è un’appendice della pagina ma la classe da cui viene ereditata la pagina .dll Schemino System.Web.UI.Page .VB Public Class Codice Inherits S.W.U.Page .aspx @Page Inherits=“Codice” public public public public Event EventHandler Load bool IsPostBack {get;} HttpRequest {get;} HttpResponse {get;} Public txtName as S.W.U.TextBox Sub Page_Load(x,y) Response.Write “x” End Sub La classe contiene le interfacce della classe base + txtName <asp:TextBox Id=“txtName” /> La pagina eredita la Classe Codice Quindi le nuove proprietà, eventi e metodi rispetto a Page Ancora Code Behind • Con l’attributo Src il Code Behind viene compilato a run-time • Si può pre-compilare il .vb|.cs • Copiarlo nella directory bin • In produzione precompilare Server Controls • • • • • • Oggetti programmabili Attributo runat=“server” Mantengono lo stato delle info Generano HTML per il client Scatenano eventi Espongono • Proprietà • Metodi Server Controls • HTML Control • Sintassi HTML • Mappati 1:1 con controlli HTML • Namespace System.Web.UI.HtmlControls • Web Controls • Sintassi diversa • Tutti gli HTML Control • E controlli avanzati HTML Control • <input type=“text” value=“default” runat=“server” id=“txtName” > • • • • Mappano i tag HTML 1:1 Lavorano bene con gli Editor attuali Ma il modello ad oggetti non è strongly-typed Ad esempio • txtName.Value = “Roberto” • ma • txtName.SetAttribute("bgcolor", "red") Web Control • <asp:TextBox runat=“server” id=“txtName” Text=“default”></asp:TextBox> • Modello ad oggetti consistente e strongly-typed • txtName.Text = “Roberto” • txtName.BackColor = Color.Red • Miglior supporto per VS.NET Designer • Rendering differente per browser • Esempio: Label • Funzionalità differenti per browser • Esempio: Validation Control Alcuni esempi • • • • • • • • • • • • <asp:textbox /> <asp:button /> <asp:imagebutton /> <asp:checkbox /> <asp:radiobutton /> <asp:listbox /> <asp:dropdownlist /> <asp:hyperlink /> <asp:image /> <asp:label /> <asp:panel /> <asp:table /> <input type=text> <input type=submit> <input type=image> <input type=checkbox> <input type=radiobutton> <select size=“5”> <select> <a href=“...”> <img src=“...”> <span> <div> <table> Altri Web Control • List Control • • • • Iterativi su una base di dati DropDownList, ListBox RadioButtonList, CheckBoxList Repeater, DataList, DataGrid • Validation Control • Ci arriviamo fra poco… • Controlli complessi (Rich Control) • Calendar, AdRotator, Xml • Mobile Control: per device e telefonini • Internet Explorer Control Dati • Variabili • Proprietà di oggetti • N.B. Anche la pagina è un oggetto • • • • • Risultati di funzioni o metodi Array Database XML Web Data Binding • Aggancio fra un elemento visivo a un dato • • • • • In modo dichiarativo Molto semplice Molto veloce Molti datasource supportati Tecnologia aperta anche per DB • Automatizzata • Non come in VB (per fortuna) • Più semplice agganciare codice ottimizzato per insert/update/delete Codice • Dichiarazione di binding semplice • • • • • <%#strDato %> <asp:Label Text=<%#strDato %> <asp:Label Text=<%#Funzione(par) %> <asp:Label Text=<%#obj.Nome %> <asp:Label Text=<%#obj.Fai(par) %> • Poi valutazione delle espressioni • Page.DataBind() • Valuta tutte le espressioni di binding • Metodo DataBind() su tutti i controlli • E valorizza i <%# %> Data Binding “multiplo” • Controlli che supportano la proprietà DataSource • Possono essere agganciati a oggetti che supportano IEnumerable o ICollection • I controlli supportano il metodo DataBind() • Che valuta il loro DataSource e popola il controllo • Invoca anche il metodo DataBind() di tutti i controlli Children • Come per la Page HtmlSelect Controlli bindabili CheckBoxList RadioButtonList Array ArrayList ComboBox HashTable DropDownList Queue ListBox DataGrid Bindabili DataList Repeater DataTextField Associa il campo da visualizzare DataValueField Associa il campo da associare SortedList Stack StringCollection DataView DataTable DataSet SqlDataReader OleDbDataReader DataReader • Per fare estrazione e presentazione di dati • Tipicamente usato nell’evento Load • Chiamare DataBind() prima di chiudere la connessione • Si può sempre usare • DataTextField • Associa il campo da visualizzare • DataValueField • Associa il campo da associare DataView • Rappresenta una vista su una DataTable • DefaultView su ogni DataTable • Custom DataView • Per filtri e sort su una DataTable • Bindando una DataTable si binda in realtà la DefaultView sulla tabella • Bindando il DataSet si binda in realtà la DefaultView della prima table DataGrid • Fornisce una rappresentazione tabellare dei dati • Formata da colonne, header e footer • Colonne autogenerabili • O esplicitamente dichiarate con BoundColumns • Visualizzazione personalizzabile • Occhio al VIEWSTATE DataGrid con Editing • EditCommandColumn visualizza link per • EditCommand, UpdateCommand, CancelCommand • OnEditCommand per gestire l’evento di editing • La DataGrid mantiene la proprietà EditItemIndex • Riga da editare • -1 se in modalità visualizzazione • DataGridCommandEventArgs viene passato ai vari handler • DataKeyField deve contenere la chiave primaria • Nell’handler UpdateCommand si usa DataKeyField per accedere alla Primary Key da modificare Templated Control • Forniscono un meccanisco per separare la visualizzazione di un controllo dalle sue funzionalità • Un templated control gestisce i dati e il layout ma usa un template da creare per il rendering attuale dei dati Template • DataList, Repeater e DataGrid • Consentono di utilizzare un template per la visualizzazione dei dati • Forniscono l’involucro per visualizzare i dati • Gestiscono il layout e il binding in automatico • Sfruttano il template fornito • La riga “in binding” è accessibile tramite Container.DataItem Templated Control e Template DataGrid Repeater DataList Columns HeaderTemplate ItemTemplate AlternatingItemTemplate SeparatorTemplate FooterTemplate HeaderTemplate ItemTemplate AlternatingItemTemplate SeparatorTemplate SelectedItemTemplate EditItemTemplate FooterTemplate TemplateColumn HeaderTemplate ItemTemplate EditItemTemplate FooterTemplate ItemTemplate AlternatingItemTemplate SeparatorTemplate SelectedItemTemplate EditItemTemplate Visualizzazione Visualizzazione Visualizzazione Visualizzazione Visualizzazione dell’elemento dell’elemento pari del separatore di riga dell’elemento selezionato della colonna in Editing DataBinder vs Container • Container.DataItem • Ritorna un Object generico • Occorre effettuare il cast • DataBinder.Eval • • • • Usa Reflection Per fare il parse e l’evaluate Dell’espressione di binding Evitando il cast Repeater • Contenitore generico • Itera sui dati • Eseguendo il rendering dell’ItemTemplate per ogni elemento della collezione DataSource • Utile per avere controllo completo sul rendering dei dati DataList • Visualizza i dati in una lista • Utile per visualizzazioni a lista • Il default è righe/colonne • Simile alla DataGrid ma • Più semplice da usare • Più leggere e quindi veloce • Richiede almeno un ItemTemplate • Ogni template ha un suo stile • HeaderStyle • ItemStyle ASP.NET XML Server Control • <asp:xml runat=server> • Gestisce l’output di XML • Trasformazione opzionale XSL/T • Bind verso file XML o Database • Caching built-in per la trasformazione • Efficente Eventi • Page Events • • • • • La pagina è una classe quindi scatena eventi Page_Init Page_Load Page_Unload La routing di evento riceve gli argomenti .NET • Control Events • Quasi sempre Change e Click • SelectedIndexChange per ListBox Definizione Evento • <input type=submit value=Premi runat=server onServerClick=“Fai”> • onClick verrebbe inviato al client • In generale ogni attributo non utilizzato serverside o sconosciuto viene inviato al client • <asp:button value=Premi runat=server onClick=“Fai” /> • Visual Studio invece • VB: AddHandler b1_Click, AddressOf btn1_Click • C#: b1.Click += new EventHandler(btn1_Click) Viene prima il click o change ? • Sequenza esatta • • • • • • Controlli_Init Validazioni...vediamo fra poco Page_Init Page_Load Controlli_Load _Changed • Per tutti i controlli modificati • In ordine random • _Click • Page_Unload • Render verso il browser GET o POST • If Request.ServerVariables(“HTTP_METHOD”) diventa • If Page.IsPostBack • Proprieta della classe Page • True se POST • False se GET Auto POST • Esempio per combo box • <asp:dropdownlist id=“lstCorsi” runat=“server” onSelectedIndexChanged=“lst_Change”> • Il Changed verrà processato al successivo post • <asp:dropdownlist id=“lstCorsi” runat=“server” autoPostBack=“True” onSelectedIndexChanged=“lst_Change”> • Viene eseguita immediatamente la post con codice Javascript client • Non potrebbe essere altrimenti • Necessita di Browser scriptabile Global.asax • Architettura completamente rivista • Quindi qualche evento in più • Si intercettano sempre con • Sub Application_qualcosa • A cui vengono passati i soliti parametri • (x as Object, e as EventArgs) Web.Config • File di configurazione • In formato XML • Occhio !!! È case sensitive • Per impostare parametri applicativi • • • • • Opzioni di compilazione Sicurezza Gestione delle sessioni Moduli HTTP (HttpModule) custom Handler HTTP • Sovrascrive le impostazioni di default • X:\WINNT\Microsoft.NET\Framework\<versione >\CONFIG\Machine.Config Web.Config • E valori custom • Connection String • Informazioni statiche che prima si mettevano in Application o su file esterni • <appSettings> • <add key=“cString” value=“.....” /> • </appSettings> • Nel codice • strConn = Configuration.AppSettings(“DSN”) Session • In ASP 1/2/3 le session • Necessitano del supporto dei cookie sul client • Sono single-machine e non adatte a configurazione di load-balancing • Consumano molta RAM • In ASP.NET le session • • • • Possono lavorare come prima oppure Non necessitare dei cookie Essere multi-machine Appoggiarsi su DB o su uno State Server Session <sessionState mode="InProc“ timeout=“20”/> • L’oggetto Session viene appoggiato nella memoria del WP di ASP.NET • Pro • Velocissime • Contro • Necessitano di cookie abilitati sul client • Se crasha l’applicazione le session si perdono • Non si può fare load balancing vero Session senza Cookie <sessionState mode="InProc“ timeout=“20” cookieless=“true" /> • L’oggetto Session viene appoggiato nella memoria del WP di ASP.NET • Pro • Velocissime • Non necessitano di cookie abilitati sul client • Contro • Se crasha l’applicazione le session si perdono • Non si può fare load balancing vero Session fuori dal WP <sessionState mode=“StateServer“ timeout=“20” stateConnectionString="tcpip=127.0.0.1:42424 /> • L’oggetto Session viene appoggiato nella memoria del servizio ASPState • Pro • Se crasha l’applicazione le session sono salve • Si può fare load balancing vero con N IIS che si appoggiano ad un solo ASPState • “Velocino” • Contro • Se crasha ASPState si perdono tutte le Session External Session State • Far partire il servizio ASPState sulla macchina indicata nel config.web • net start aspnet_state • Necessita di Premium Edition • Altri 19 Mb di download • Tip: Se conosciuto meglio indicare l’indirizzo IP • Tip2: Configurazione diversa fra test e produzione Session fuori dal WP <sessionState mode=“SQLServer“ timeout=“20” sqlConnectionString="data source=127.0.0.1;user id=sa;password=" /> • Pro • Se crasha l’applicazione le session sono salve • Si può fare load balancing vero con N IIS che si appoggiano ad un solo SQL Server • SQL in Cluster per Fault-tolerance • Contro • Più lento • Configurare SQL in Cluster Custom User Control • • • • • Creazione di controlli personalizzati .ascx Da riutilizzare nelle pagine ASPX Simili alle “vecchie” #INCLUDE Ma sono classi • Quindi espongono • Proprietà • Metodi • Eventi User Controls • • • • File .ascx @Control Language=“vb” Inserire i controlli Get e Set per esporre i valori dei controlli • Nella Pagina che li utilizza • <%Register TagPrefix=“mio” TagName=“Nome” Src=“xxx.ascx” %> • <mio:Nome id=ctlNome runat=“server” /> • Utilizzo dei valori interni ctlNome.xxx Ancora User Controls • Caricare un controllo a RunTime • Page.LoadControl(string source) • Customizzarlo • Dim ctl1 As UserControl • ctl1 = LoadControl(“Toolbar.ascx") • CType(ctl1, (Toolbar_ascx)).Titolo = “Home Page” • Caricamento nella gerarchia della pagina • Page.Controls.Add (ctl1) Componenti • Sono assembly .NET quindi creare • .VB o .CS • Namespace myCorsi • Public Class Attivi • Public Function getCorsi(...) • …… • Compilazione • Vbc /t:library /out:myCorsi.dll myCorsi.vb • Con le librerie utilizzate • E copiarlo nella directory Bin Componenti • Nella Pagina che li utilizza • <%@Import Namespace=“myCorsi” %> • Dim x as New myCorsi.Attivi • ds = x.GetCorsi(….) • Oppure copiarlo fuori dalla Bin • E usare la direttiva Assembly • Visual Studio automatizza il tutto Caching • Il miglior modo di ottimizzare un’applicazione è non eseguire il codice • Se i dati non cambiano in un arco di tempo perchè rieseguire le query ? • Il codice statico è molto più veloce del codice dinamico Cache Location • <%@OutputCache Location= “ “ %> • • • • • Server Client Downstream Public None • Da codice • Response.Cache.SetCacheability • HttpCacheability.Server • HttpCacheability.Client • .... Partial Caching • Non è detto che si voglia sempre cachare tutta la pagina • Sensato cachare solo le parti comuni • Partial Page Caching • • • • • Consente di cachare User Control Ognuno con criteri diversi La sintassi è identica Attributo VaryByControl Estensibile con Proprietà Data Caching • Application State • • • • Application Memoria condivisa per tutta l’applicazione Accesso tramite Nome/Valore Cachare i dati usati frequentemente • Esempio: Elenco prodotti • Non usarla per dati temporanei • Difficile impostare una scadenza • Esempio: L’elenco prodotti cambia Data Caching – Cache API • Pensata per dati temporanei • • • • Oggetto Cache Memoria condivisa per tutta l’applicazione Accesso tramite Nome/Valore Non è il nuovo oggetto Application • Cachare i dati usati di frequente • Gli item usati “poco” vengono rimossi • Attenzione !!! • Supporta la notifica di rimozione tramite il Delegate CacheItemRemovedCallBack • Dipendenze (key, file, time) Cache Dependency • Dependency da file • • • • New CacheDependency(“xxx.yyy”) Oppure su una directory Oppure su un’altro item in cache Anche più di 1 Error Debugging • VS.NET per debug completo anche per ASP.NET • Call stack, breakpoint, watch window, ecc • ASP.NET Error Pages consento un tracking/debugging semplice • Si abilita nel web.config • <compilation debugmode="true" /> • O nella singola pagina • <%@ Page Debug=“true” %> Error Handling • .NET fornisce un meccanismo unificato per gestire gli errori • Utilizzando exception • Una call stack con tutte le informazioni • Try/Catch/Finally/Throw in tutti i linguaggi • ASP.NET fornisce anche un metodo dichiarativo • Per logging di errori • Redirige automaticamente l’utente ad una pagina di gestione errori Oppure Application_Error • Scatta per tutte le eccezioni non gestite • Accesso alla Request corrente • Accesso all’oggetto Exception • Prendere provvedimenti • Pagina di errore generica • Oppure • Scrivere nell’EventLog • Semplicissimo con la classe EventLog • Mandare una mail • Semplicissimo con la classe SmtpMail In generale • Da ASP.NET non vi sono vincoli sull’accesso alle classi .NET • Un altro esempio • Aggiungere Counter (Performance Monitor) • Per real-time monitoring • Esempi • Accesso ad una pagina particolare • Totale iscrizioni online • Totale di quello che vi pare ASP.NET Security Token per processi e thread RobertoB RobertoB LucaR cmd.exe cmd.exe Molto spesso... • Il nostro codice usa array, oggetti, funzioni, ... per eseguire verifiche di accesso • Basate su • Nostri utenti • Nostri gruppi applicativi • Memorizzati su DB o file di configurazione • Ci siamo quindi inventati meccanismi di autenticazione e autorizzazione proprietari • Che esulano dai meccanismi Windows CLR Security • Ogni Thread nel CLR ha un Security Principal • Su cui il codice può eseguire controlli di accesso • Un Security Principal del CLR può essere • Un WindowsPrincipal • Identity e Ruoli == al sistema operativo • Un GenericPrincipal • Identity e Ruoli != dal sistema operativo • Un Security Principal deve avere almeno un’identity • WindowsIdentity • GenericIdentity Applicazione .NET RobertoB Windows CLR RobertoB MioUtente GI = New GenericIdentity “MioUtente” User = GI If User.Name = “MioUtente” then eseguo... .NetApp.exe ASP.NET • La configurazione determina il Principal • Del thread del SO • Del thread del CLR • Sono ortogonali • IIS fornisce il token del thread del SO • L’autenticazione IIS si configura con il metabase • ASP.NET fornisce il principal per il thread del CLR • L’autenticazione ASP.NET si configura con il web.config Quindi di default Process Thread IIS Anon. System IUSR_xxx Client Sist. Oper. I/O Servizi ecc. ASP.NET ASPNET ASPNET .ASPX <processModel userName=“SYSTEM”> Process Thread IIS Anon. System IUSR_xxx Client Sist. Oper. I/O Servizi ecc. ASP.NET SYSTEM ASPNET .ASPX Anche se IIS blocca Anonimo Process Thread IIS Anon. System RobertoB Client Sist. Oper. I/O Servizi ecc. ASP.NET SYSTEM ASPNET .ASPX ASP.NET Impersonation • Far passare il token di IIS sul thread di ASPNET_WP.exe • <configuration> • <system.web> • <identity impersonate=“true” /> • <system.web> • </configuration> Impersonation Process Thread IIS Anon. System IUSR_xxx Client Sist. Oper. I/O Servizi ecc. ASP.NET IUSR_xxx ASPNET .ASPX se Blocco Anonimo Process Thread IIS Anon. System RobertoB Client Sist. Oper. I/O Servizi ecc. ASP.NET RobertoB ASPNET .ASPX Impersonation • Si può impersonare anche un utente applicativo per tutta l’applicazione • <identity impersonate=“true” userName=“UtenteAppl” password=“Pippo” /> • Per usare un solo utente che rappresenta l’applicazione semplificando la gestione della sicurezza sulle risorse • Quello che si fa(ceva) per COM+ Authentication VS Authorization • Authentication risponde alla domanda • Chi Sei ? • Authorization risponde alla domanda • Cosa puoi fare ? • ASP.NET fornisce un’infrastruttura per entrambi • Iniziamo dalla prima Metodi di Authentication • None • Windows (default) • Usato fino ad adesso • Forms • Passport • Si impostano nel web.config Windows Authentication • Lavora in una Intranet • Con gli account e gruppi esistenti • Necessita di Impersonation True • Come abbiamo visto prima • Identity Thread CLR • User.Identity.Name • Identity Windows • WindowsIdentity.GetCurrent().Name • Test di appartenenza a gruppi • User.IsInRole(“Domain\Group”) Web.Config Authorization • Implementato da UrlAuthorizationModule • Si applica a tutte le modalità di autenticazione • I permessi si impostano • Con Grant/Deny • Per Utenti e Ruoli • In Windows Authentication gli utenti devono corrispondere a quelli del SO • Authority\principal • Il modulo ritorna “401” su Access Denied • IIS gira il codice 401 in una richiesta di autenticazione Web.Config Authorization • <configuration> • <system.web> • <authorization> • <deny users=“?” /> • <allow roles=“Miestaff\Segreteria” /> • <deny users=“*” /> • </authorization> • <system.web> • </configuration> Forms Authentication • L’autenticazione Windows non può essere usata per siti pubblici • Task amministrativi enormi • Non passa dai firewall • Conoscere il Principal Windows rende il nostro sistema più attaccabile • ASP.NET fornisce un’infrastruttura per evitare di svilupparsi tutto a mano • Utilizza i cookie • Automatizza le redirection • Mini forma di amministrazione (manuale) Signout • FormsAuthentication.SignOut() • Elimina il cookie • E quindi l’utente perde la sua identità • Nelle richieste successive • Altri metodi • • • • GetAuthCookie SetAuthCookie Encrypt Decrypt Tips • Usare HTTPS per • Criptare il traffico di username e password • Criptare i cookie persistenti su disco • RedirectFromLoginPage(..., True) • Su tutto il sito per evitare che il cookie di login passi in chiaro • Occhio ai tag IMG e HREF • Negare l’accesso Http a tutte le parti protette per essere sicuri Proviamo a riepilogare • Windows Authentication • Per le intranet • Impersonation True • Per far passare il SecurityPrincipal di IIS a ASP.NET • Customizzabile per i ruoli • Forms Authentication • • • • Per siti web esterni Gestione utenti automatica O customizzabile Ruoli gestibili da codice Considerazioni finali • ASP.NET è una libreria di classi che consente lo sviluppo di applicazioni Web dinamiche • È possibile utilizzare tutte le librerie disponibili con il .NET Framework • Web Form e Web Controls permettono di trattare lo sviluppo Web in modo simile a quello Windows • Insieme con le funzionalità di collegamento ai dati è possibile ridurre fortemente i tempi di sviluppo • Le prestazioni del codice compilato sono molto superiori alle tecnologie interpretate • ASP tradizionale, PHP, ecc. Link utili • MSDN Academic Allicance • http://www.msdnaa.net • MSDN Studenti • http://www.microsoft.com/italy/msdn/studenti • MSDN Online • http://msdn.microsoft.com • GotDotNET • http://www.gotdotnet.com • ASP.NET • http://www.asp.net • Windows Forms • http://www.windowsforms.net • DevLeap • http://www.devleap.it • UgiDotNet • http://www.ugidotnet.org © 2003-2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.