Al momento sei offline in attesa che la connessione Internet venga ristabilita

Implementazione dell'autenticazione basata su form in un'applicazione ASP.NET con C#.NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I301240
Per la versione di questo articolo relativa a Microsoft Visual Basic .NET, vedere 308157.

In questo articolo si fa riferimento ai seguenti spazi dei nomi della libreria di classi di Microsoft .NET Framework:
  • System.Data.SqlClient
  • System.Web.Security

CONTENUTO DELL'ATTIVITÀ

Sommario
In questo articolo viene spiegato come implementare l'autenticazione basata su form utilizzando un database per l'archiviazione degli utenti.

back to the top

Requisiti

Nell'elenco riportato di seguito sono indicati l'hardware, il software, l'infrastruttura di rete e i Service Pack necessari:
  • Microsoft Visual Studio .NET
  • Microsoft Internet Information Services (IIS) 5.0 o versioni successive
  • Microsoft SQL Server
back to the top

Creare un'applicazione ASP .NET con C# .NET

  1. Aprire Visual Studio .NET.
  2. Creare una nuova applicazione Web ASP .NET specificando nome e percorso.
back to the top

Configurare le impostazioni di sicurezza nel file Web.config

In questa sezione viene illustrato come aggiungere e modificare le sezioni di configurazione <authentication> e <authorization> per configurare l'applicazione ASP.NET in modo che venga utilizzata l'autenticazione basata su form.
  1. Aprire il file Web.config in Esplora soluzioni.
  2. Modificare la modalità di autenticazione in Form.
  3. Inserire il tag <Forms> e immettere gli attributi appropriati (per ulteriori informazioni su questi attributi, fare riferimento alla documentazione di MSDN o QuickStart riportata nella sezione RIFERIMENTI). Copiare il codice riportato di seguito, quindi scegliere Incolla come HTML nel menu Modifica per incollare il codice nella sezione <authentication> del file:
    <authentication mode="Forms">   <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"    protection="All" path="/" timeout="30" /></authentication> 					
  4. Impedire l'accesso a utenti anonimi nella sezione <authorization> nel modo indicato di seguito:
    <authorization>   <deny users ="?" />   <allow users = "*" /></authorization>					
back to the top

Creare una tabella di database di esempio per l'archiviazione di informazioni sugli utenti

In questa sezione viene spiegato come creare un database di esempio per l'archiviazione di nomi utente, password e ruolo degli utenti. Se si desidera archiviare nel database i ruoli degli utenti e implementare una protezione basata sui ruoli è necessaria un'apposita colonna.
  1. Fare clic sul pulsante Start, scegliere Esegui, quindi digitare notepad per aprire il Blocco note.
  2. Evidenziare il codice di script SQL riportato di seguito, fare clic con il pulsante destro del mouse su tale codice, quindi scegliere Copia. Nel Blocco note scegliere Incolla dal menu Modifica per incollare il codice riportato di seguito:
    if exists (select * from sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[Users]GOCREATE TABLE [dbo].[Users] (   [uname] [varchar] (15) NOT NULL ,   [Pwd] [varchar] (25) NOT NULL ,   [userRole] [varchar] (25) NOT NULL ,) ON [PRIMARY]GOALTER TABLE [dbo].[Users] WITH NOCHECK ADD    CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED    (      [uname]   )  ON [PRIMARY] GOINSERT INTO Users values('user1','user1','Manager')INSERT INTO Users values('user2','user2','Admin')INSERT INTO Users values('user3','user3','User')GO					
  3. Salvare il file come Users.sql.
  4. Nel computer in cui è installato Microsoft SQL Server aprire Users.sql in Query Analyzer. Selezionare pubs dall'elenco di database, quindi eseguire lo script. Verrà creata una tabella utenti di esempio che sarà inserita nel database Pubs per l'utilizzo con l'applicazione di esempio.
back to the top

Creare una pagina Logon.aspx

  1. Aggiungere al progetto un nuovo Web Form denominato Logon.aspx.
  2. Aprire la pagina Logon.aspx nell'editor e passare alla visualizzazione HTML.
  3. Copiare il codice riportato di seguito, quindi scegliere Incolla come HTML dal menu Modifica per inserire il codice tra i tag <form>:
    <h3>   <font face="Verdana">Logon Page</font></h3><table>   <tr>      <td>Email:</td>      <td><input id="txtUserName" type="text" runat="server"></td>      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"           Display="Static" ErrorMessage="*" runat="server"            ID="vUserName" /></td>   </tr>   <tr>      <td>Password:</td>      <td><input id="txtUserPass" type="password" runat="server"></td>      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"          Display="Static" ErrorMessage="*" runat="server"           ID="vUserPass" />      </td>   </tr>   <tr>      <td>Persistent Cookie:</td>      <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>      <td></td>   </tr></table><input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p><asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />						
    Questo Web Form viene utilizzato per visualizzare agli utenti un form di accesso in modo che possano digitarvi nome utente e password per accedere all'applicazione.
  4. Passare alla visualizzazione Progettazione e salvare la pagina.
back to the top

Specificare il codice del gestore eventi per la convalida delle credenziali utente

In questa sezione viene illustrato il codice sottostante inserito nella pagina Logon.aspx.cs.
  1. Fare doppio clic su Logon per aprire il file Logon.aspx.cs.
  2. Impostare gli spazi dei nomi necessari nel file di codice sottostante:
    using System.Data.SqlClient;using System.Web.Security;					
  3. Creare una funzione ValidateUser per la convalida delle credenziali utente a seconda del contenuto del database. Accertarsi di avere modificato la stringa Connection in modo che si riferisca al database corretto.
    private bool ValidateUser( string userName, string passWord ){	SqlConnection conn;	SqlCommand cmd;	string lookupPassword = null;	// Check for invalid userName.	// userName must not be null and must be between 1 and 15 characters.	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )	{		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );		return false;	}	// Check for invalid passWord.	// passWord must not be null and must be between 1 and 25 characters.	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )	{		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );		return false;	}	try	{		// Consult with your SQL Server administrator for an appropriate connection		// string to use to connect to your local SQL Server.		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );		conn.Open();		// Create SqlCommand to select pwd field from users table given supplied userName.		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );		cmd.Parameters["@userName"].Value = userName;		// Execute command and fetch pwd field into lookupPassword string.		lookupPassword = (string) cmd.ExecuteScalar();		// Cleanup command and connection objects.		cmd.Dispose();		conn.Dispose();	}	catch ( Exception ex )	{		// Add error handling here for debugging.		// This error message should not be sent back to the caller.		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );	}	// If no password found, return false.	if ( null == lookupPassword ) 	{		// You could write failed login attempts here to event log for additional security.		return false;	}	// Compare lookupPassword and input passWord, using a case-sensitive comparison.	return ( 0 == string.Compare( lookupPassword, passWord, false ) );}					
  4. È possibile utilizzare uno dei due metodi riportati di seguito per generare il cookie di autenticazione basata su form e reindirizzare l'utente a una pagina appropriata dell'evento cmdLogin_ServerClick. Viene fornito il codice di esempio relativo a entrambi i metodi. Utilizzare quello più adatto alle proprie esigenze.
    • Chiamare il metodo RedirectFromLoginPage per generare automaticamente il cookie di autenticazione basata su form e reindirizzare l'utente a una pagina appropriata dell'evento cmdLogin_ServerClick:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e){if (ValidateUser(txtUserName.Value,txtUserPass.Value) )	FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,		chkPersistCookie.Checked);	else		Response.Redirect("logon.aspx", true);}						
    • Generare il ticket di autenticazione, crittografarlo, creare un cookie, aggiungerlo alla risposta e reindirizzare l'utente. Questo metodo garantisce un maggiore controllo sulla modalità di creazione del cookie. In questo caso è inoltre possibile aggiungere dati personalizzati a FormsAuthenticationTicket.
      private void cmdLogin_ServerClick(object sender, System.EventArgs e){   if (ValidateUser(txtUserName.Value,txtUserPass.Value) )   {      FormsAuthenticationTicket tkt;      string cookiestr;      HttpCookie ck;      tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");      cookiestr = FormsAuthentication.Encrypt(tkt);      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);      if (chkPersistCookie.Checked)      ck.Expires=tkt.Expiration;			    ck.Path = FormsAuthentication.FormsCookiePath;       Response.Cookies.Add(ck);      string strRedirect;      strRedirect = Request["ReturnUrl"];      if (strRedirect==null)            strRedirect = "default.aspx";         Response.Redirect(strRedirect, true);   }   else      Response.Redirect("logon.aspx", true);}						
  5. Assicurarsi che il codice riportato di seguito venga aggiunto al metodo InitializeComponent nel codice generato da Progettazione Web Form:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);					
back to the top

Creare una pagina Default.aspx

In questa sezione viene creata una pagina di prova a cui vengono reindirizzati gli utenti dopo l'autenticazione. Se gli utenti visualizzano questa pagina senza avere prima effettuato l'accesso all'applicazione, vengono reindirizzati alla pagina di accesso.
  1. Rinominare la pagina WebForm1.aspx in Default.aspx e aprirla nell'editor.
  2. Passare alla visualizzazione HTML e copiare il codice riportato di seguito fra i tag <form>:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">						
    Questo pulsante viene utilizzato per disconnettersi dalla sezione di autenticazione mediante form.
  3. Passare alla visualizzazione Progettazione e salvare la pagina.
  4. Impostare gli spazi dei nomi necessari nel file di codice sottostante:
    using System.Web.Security;					
  5. Fare doppio clic su SignOut per aprire la pagina di codice sottostante (Default.aspx.cs) e copiare il codice riportato di seguito nel gestore eventi cmdSignOut_ServerClick:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e){   FormsAuthentication.SignOut();   Response.Redirect("logon.aspx", true);}					
  6. Assicurarsi che il codice riportato di seguito venga aggiunto al metodo InitializeComponent nel codice generato da Progettazione Web Form:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);					
  7. Salvare e compilare il progetto. A questo punto è possibile utilizzare l'applicazione.
back to the top

Note aggiuntive

  • Per archiviare le password in modo protetto in un database, è possibile utilizzare la funzione utility della classe FormsAuthentication denominata HashPasswordForStoringInConfigFile per crittografare le password prima di archiviarle nel database o nel file di configurazione.
  • È possibile archiviare le informazioni relative alla connessione SQL nel file di configurazione (Web.config) in modo da poterle modificare facilmente se necessario.
  • Può essere utile aggiungere codice per impedire l'accesso a pirati informatici che tentano di utilizzare varie combinazioni di password. È ad esempio possibile includere una logica che accetti solo due o tre tentativi di accesso. Se l'utente non è in grado di accedere dopo un determinato numero di tentativi, è possibile impostare un flag nel database per impedirne l'accesso finché l'account dell'utente non viene riattivato visitando una pagina diversa o chiamando il servizio di assistenza. Laddove necessario, sarà opportuno aggiungere un'adeguata gestione degli errori.
  • Poiché l'utente viene identificato in base al cookie di autenticazione, è possibile utilizzare SSL (Secure Sockets Layer) nell'applicazione per impedire l'intercettazione del cookie di autenticazione e di altre importanti informazioni trasmesse.
  • Per l'autenticazione basata su form è necessario che nel browser del client i cookie vengano accettati o abilitati.
  • Il parametro timeout della sezione di configurazione <authentication> determina l'intervallo di tempo dopo il quale il cookie di autenticazione viene rigenerato. È possibile scegliere il valore che offre le migliori prestazioni e il maggior livello di protezione.
  • È possibile che alcuni proxy e cache intermedi in Internet memorizzino le risposte del server Web contenenti intestazioni Set-Cookie e che le restituiscano successivamente a un utente diverso. Poiché nell'autenticazione basata su form viene utilizzato un cookie per autenticare gli utenti, può accadere che un utente rappresenti accidentalmente o intenzionalmente un altro utente avendo ricevuto un cookie da proxy o cache intermedi di cui originariamente non era il destinatario.
back to the top
Riferimenti
Per ulteriori informazioni su come implementare l'autenticazione basata su form che utilizza la sezione <credentials> per l'archiviazione di utenti e password, vedere il seguente esempio ASP.NET QuickStart sul sito Web GotDotNet (informazioni in lingua inglese): Per ulteriori informazioni su come implementare l'autenticazione basata su form che utilizza un file XML per archiviare utenti e password, vedere il seguente argomento della documentazione di .NET Framework Software Development Kit (SDK):
Autenticazione basata su form utilizzando un file utenti XML
http://msdn.microsoft.com/it-it/library/1b1y85bh(vs.71).aspx
Per ulteriori informazioni sulla protezione di applicazioni Web ASP .NET, vedere la documentazione di Microsoft .NET Framework Developer's Guide seguente (informazioni in inglese): Per ulteriori informazioni sullo spazio dei nomi System.Web.Security, vedere la documentazione di Microsoft .NET Framework Reference seguente (informazioni in inglese): Per ulteriori informazioni sulla configurazione di ASP.NET, vedere la documentazione di Microsoft .NET Framework Developer's Guide seguente (informazioni in inglese): Per informazioni sulle linee guida per la sicurezza ASP.NET, fare riferimento al white paper MSDN seguente (informazioni in inglese):
Autenticazione in ASP.NET: regole per la protezione di .NET
http://msdn.microsoft.com/it-it/library/ms978378.aspx
Per ulteriori informazioni a carattere generale su ASP.NET, fare riferimento al newsgroup MSDN seguente (informazioni in inglese): back to the top
Nota: questo è un articolo a "PUBBLICAZIONE RAPIDA", creato direttamente all'interno dell'organizzazione di supporto Microsoft. Le informazioni contenute nel presente documento vengono fornite "così come sono" in risposta alle problematiche riscontrate. A causa della rapidità con cui vengono resi disponibili, i materiali possono contenere errori di battitura e sono soggetti a modifica senza preavviso, in qualsiasi momento. Per altre considerazioni, vedere le Condizioni per l'utilizzo.
Proprietà

ID articolo: 301240 - Ultima revisione: 06/29/2012 11:35:00 - Revisione: 1.0

Microsoft ASP.NET 1.1, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft ASP.NET 1.0, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 64-bit Edition

  • kbconfig kbhowtomaster kbsecurity kbweb KB301240
Feedback
&t=">