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

Traduzione articoli Traduzione articoli
Identificativo articolo: 301240 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I301240
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

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

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

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.

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>
    					

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]
    GO
    CREATE TABLE [dbo].[Users] (
       [uname] [varchar] (15) NOT NULL ,
       [Pwd] [varchar] (25) NOT NULL ,
       [userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
       CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
       (
          [uname]
       )  ON [PRIMARY] 
    GO
    
    INSERT 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.

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.

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);
    					

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.

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.

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):
Autenticazione basata su form
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
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):
Protezione di applicazioni Web ASP.NET
http://msdn.microsoft.com/it-it/library/330a99hc(vs.71).aspx
Per ulteriori informazioni sullo spazio dei nomi System.Web.Security, vedere la documentazione di Microsoft .NET Framework Reference seguente (informazioni in inglese):
Spazio dei nomi System.Web.Security
http://msdn.microsoft.com/it-it/library/system.web.security(vs.71).aspx
Per ulteriori informazioni sulla configurazione di ASP.NET, vedere la documentazione di Microsoft .NET Framework Developer's Guide seguente (informazioni in inglese):
Configurazione di ASP.NET
http://msdn.microsoft.com/it-it/library/aa719558(VS.71).aspx

Sezioni di configurazione di ASP.NET
http://msdn.microsoft.com/it-it/library/w7w4sb0w(vs.71).aspx
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):
http://www.microsoft.com/italy/msdn/community/newsgroup/default.mspx
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Ó

Identificativo articolo: 301240 - Ultima modifica: venerdý 29 giugno 2012 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbconfig kbhowtomaster kbsecurity kbweb KB301240
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com