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.
Scarica

Document