Numéro d'article: 301240 - Dernière mise à jour: vendredi 18 mai 2007 - Version: 7.9

Comment faire pour implémenter l'authentification basée sur les formulaires dans votre application ASP.NET à l'aide de C# .NET

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Ancien nº de publication de cet article : F301240
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).

Sommaire

Agrandir tout | Réduire tout

Résumé

Cet article explique comment implémenter l'authentification basée sur les formulaires en utilisant une base de données pour stocker les utilisateurs.

Conditions requises

La liste suivante indique le matériel, les logiciels, l'infrastructure réseau et les Service Packs recommandés dont vous avez besoin :
  • Microsoft Visual Studio .NET
  • Microsoft Internet Information Services (IIS) version 5.0 ou ultérieure
  • Microsoft SQL Server

Création d'une application ASP.NET à l'aide de Visual C# .NET

  1. Ouvrez Visual Studio .NET.
  2. Créez une application Web ASP.NET et spécifiez le nom et l'emplacement.

Configuration des paramètres de sécurité dans le fichier Web.config

Cette section démontre comment ajouter et modifier les sections de configuration <authentication> et <authorization> pour configurer l'application ASP.NET de façon à utiliser l'authentication basée sur les formulaires.
  1. Dans l'Explorateur de solutions, ouvrez le fichier Web.config.
  2. Sélectionnez le mode d'authentification Formulaires.
  3. Insérez la balise <Forms> et remplissez les attributs appropriés. (Pour plus d'informations sur ces attributs, reportez-vous à la documentation MSDN ou Démarrage rapide répertoriée dans la section RÉFÉRENCES.) Copiez le code suivant, puis cliquez sur Coller au format HTML dans le menu Edition pour coller le code dans la section <authentication> du fichier :
    <authentication mode="Forms">
       <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
       protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. Refusez l'accès à l'utilisateur anonyme dans la section <authorization> comme suit :
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

Création d'un exemple de table de base de données pour stocker les détails des utilisateurs

Cette section démontre comment créer un exemple de base de données pour stocker le nom d'utilisateur, le mot de passe et le rôle des utilisateurs. Vous devez spécifier la colonne de rôle si vous souhaitez stocker des rôles d'utilisateurs dans la base de données et implémenter la sécurité basée sur les rôles.
  1. Dans le menu Démarrer, cliquez sur Exécuter, puis tapez notepad pour ouvrir le Bloc-notes.
  2. Sélectionnez le code de script SQL suivant, cliquez avec le bouton droit sur le code, puis cliquez sur Copier. Dans le Bloc-notes, cliquez sur Coller dans le menu Edition pour coller le code suivant :
    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. Enregistrez le fichier sous Users.sql.
  4. Sur l'ordinateur Microsoft SQL Server, ouvrez Users.sql dans l'Analyseur de requêtes. Dans la liste de bases de données, cliquez sur pubs et exécutez le script. Cette action crée un exemple de table d'utilisateurs et remplit la table de la base de données Pubs à utiliser avec cet exemple d'application.

Création d'une page Logon.aspx

  1. Ajoutez un nouveau Web Form au projet nommé Logon.aspx.
  2. Ouvrez la page Logon.aspx dans l'éditeur, puis basculez en mode HTML.
  3. Copiez le code suivant et utilisez l'option Coller au format HTML du menu Edition pour insérer le code entre les balises <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" />
    						
    Ce Web Form est utilisé pour présenter un formulaire d'ouverture de session aux utilisateurs de sorte qu'ils puissent fournir leur nom d'utilisateur et leur mot de passe afin de se connecter à l'application.
  4. Basculez en mode Création, puis enregistrez la page.

Écriture du code du gestionnaire d'événements de sorte qu'il valide les informations d'identification des utilisateurs

Cette section contient le code qui est placé dans la page code-behind (Logon.aspx.cs).
  1. Double-cliquez sur Logon pour ouvrir le fichier Logon.aspx.cs.
  2. Importez les espaces de noms requis dans le fichier code-behind :
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. Créez une fonction ValidateUser pour valider les informations d'identification des utilisateurs en consultant la base de données. (Assurez-vous de modifier la chaîne de connexion de sorte qu'elle pointe vers votre base de données.)
    private bool ValidateUser( string userName, string passWord )
    {
    	SqlConnection conn;
    	SqlCommand cmd;
    	string lookupPassword = null;
    
    	// Vérifie la présence de userName non valide.
    	// userName ne doit pas être nul et doit comprendre entre 1 et 15 caractères.
    	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
    		return false;
    	}
    
    	// Vérifie la présence de passWord non valide.
    	// passWord ne doit pas être nul et doit comprendre entre 1 et 25 caractères.
    	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
    		return false;
    	}
    
    	try
    	{
    		// Contactez votre administrateur SQL Server afin d'obtenir une chaîne de connexion
    		// appropriée à utiliser pour la connexion à votre serveur SQL local.
    		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
    		conn.Open();
    
    		// Crée SqlCommand pour sélectionner le champ pwd dans la table d'utilisateurs étant donné le userName fourni.
    		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
    		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
    		cmd.Parameters["@userName"].Value = userName;
    
    		// Exécute la commande et récupère le champ pwd dans la chaîne lookupPassword.
    		lookupPassword = (string) cmd.ExecuteScalar();
    
    		// Nettoie la commande et les objets de connexion.
    		cmd.Dispose();
    		conn.Dispose();
    	}
    	catch ( Exception ex )
    	{
    		// Ajoute ici la gestion des erreurs pour le débogage.
    		// Ce message d'erreur ne doit pas être renvoyé à l'appelant.
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    	}
    
    	// Si aucun mot de passe n'est trouvé, retourne false.
    	if ( null == lookupPassword ) 
    	{
    		// Vous pouvez écrire ici les échecs de tentative de connexion dans le journal des événements, pour une sécurité accrue.
    		return false;
    	}
    
    	// Compare lookupPassword et le passWord d'entrée à l'aide d'une comparaison sensible à la casse.
    	return ( 0 == string.Compare( lookupPassword, passWord, false ) );
    
    }
    					
  4. Deux méthodes peuvent être appliquées pour générer le cookie d'authentification basée sur les formulaires et rediriger l'utilisateur vers une page appropriée dans l'événement cmdLogin_ServerClick. Un exemple de code est fourni pour les deux scénarios. Appliquez l'une des deux méthodes, selon vos exigences.
    • Appelez la méthode RedirectFromLoginPage pour générer automatiquement le cookie d'authentification basée sur les formulaires et rediriger l'utilisateur vers une page appropriée dans l'événement 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);
      }
      						
    • Générez le ticket d'authentification, chiffrez-le, créez un cookie, ajoutez-le à la séquence, puis redirigez l'utilisateur. Cette méthode procure un contrôle accru sur la création du cookie. Dans ce cas, vous pouvez également inclure des données personnalisées avec 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. Assurez-vous que le code suivant est ajouté à la méthode InitializeComponent dans le code généré par le Concepteur Web Form :
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Création d'une page Default.aspx

Cette section montre comment créer une page de test vers laquelle les utilisateurs sont redirigés après l'authentification. Si les utilisateurs accèdent à cette page sans d'abord se connecter à l'application, ils sont redirigés vers la page d'ouverture de session.
  1. Renommez la page WebForm1.aspx existante en Default.aspx, puis ouvrez-la dans l'éditeur.
  2. Basculez en mode HTML et copiez le code suivant entre les balises <form> :
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Cette bouton permet de fermer la session d'authentification basée sur les formulaires.
  3. Basculez en mode Création, puis enregistrez la page.
  4. Importez les espaces de noms requis dans le fichier code-behind :
    using System.Web.Security;
    					
  5. Double-cliquez sur SignOut pour ouvrir la page code-behind (Default.aspx.cs), puis copiez le code suivant dans le gestionnaire d'événements cmdSignOut_ServerClick :
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
       FormsAuthentication.SignOut();
       Response.Redirect("logon.aspx", true);
    }
    					
  6. Assurez-vous que le code suivant est ajouté à la méthode InitializeComponent dans le code généré par le Concepteur Web Form :
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. Enregistrez et compilez le projet. Vous pouvez maintenant utiliser l'application.

Remarques supplémentaires

  • Vous souhaiterez peut-être stocker les mots de passe de manière sécurisée dans une base de données. Vous pouvez utiliser la fonction utilitaire de classe FormsAuthentication nommée HashPasswordForStoringInConfigFile pour chiffrer les mots de passe avant de les stocker dans la base de données ou dans le fichier de configuration.
  • Vous souhaiterez peut-être stocker les informations de connexion SQL dans le fichier de configuration (Web.config) de manière à pouvoir les modifier facilement si nécessaire.
  • Vous pourriez ajouter du code afin d'empêcher les pirates informatiques qui essaient différentes combinaisons de mots de passe de se connecter. Par exemple, vous pouvez inclure une logique qui accepte uniquement deux ou trois tentatives de connexion. Si l'utilisateur ne peut se connecter après un certain nombre de tentatives, il peut être utile de définir un indicateur dans la base de données afin d'interdire à cet utilisateur de se connecter tant qu'il n'a pas réactivé son compte en accédant à une page différente ou en appelant le bureau d'assistance. En outre, vous devez ajouter une gestion des erreurs appropriée le cas échéant.
  • L'utilisateur étant identifié d'après le cookie d'authentification, vous souhaiterez peut-être utiliser le protocole SSL (Secure Sockets Layer) sur cette application de sorte que personne ne puisse intercepter le cookie d'authentification ni toute autre information sensible transmise.
  • L'authentification basée sur les formulaires exige que votre client accepte ou active les cookies dans son navigateur.
  • Le paramètre timeout de la section <authentication> contrôle l'intervalle de regénération du cookie d'authentification. Vous pouvez sélectionner une valeur qui optimise la sécurité et les performances.
  • Certains caches et proxy intermédiaires sur Internet peuvent mettre en cache les réponses de serveur Web qui contiennent des en-têtes Set-Cookie, qui sont ensuite retournées à un utilisateur différent. L'authentification basée sur les formulaires utilisant un cookie pour authentifier les utilisateurs, cela peut permettre à un utilisateur d'emprunter l'identité (accidentellement ou intentionnellement) d'un autre utilisateur en recevant de la part d'un cache ou d'un proxy intermédiaire un cookie qui ne lui était pas destiné initialement.

Références

Pour plus d'informations sur la façon d'implémenter l'authentification simple basée sur les formulaires qui utilise la section <credentials> pour stocker des utilisateurs et des mots de passe, reportez-vous à l'exemple de Démarrage rapide ASP.NET GotDotNet suivant :
Authentification basée sur les formulaires (en anglais)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx (http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx)
Pour plus d'informations sur la façon d'implémenter l'authentification basée sur les formulaires qui utilise un fichier XML pour stocker des utilisateurs et des mots de passe, reportez-vous à la rubrique suivante dans la documentation du Kit de développement SDK .NET Framework :
Authentification basée sur les formulaires à l'aide d'un fichier d'utilisateurs XML (en anglais)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp)
Pour plus d'informations sur la sécurité des applications Web ASP.NET, reportez-vous à la documentation du Guide de développement Microsoft .NET Framework suivante :
Sécurité des applications Web ASP.NET (en anglais)
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx)
Pour plus d'informations sur l'espace de noms System.Web.Security, reportez-vous à la documentation de référence du Microsoft .NET Framework suivante :
Espace de noms System.Web.Security (en anglais)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp)
Pour plus d'informations sur la configuration Web ASP.NET, reportez-vous aux articles suivants du Guide de développement Microsoft .NET Framework :
Configuration ASP.NET (en anglais)
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx)

Sections de configuration ASP.NET (en anglais)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp)
Pour plus d'informations sur les directives de sécurité ASP.NET, consultez le livre blanc MSDN à l'adresse suivante :
Authentification dans ASP.NET : directives de sécurité .NET (en anglais)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx (http://msdn2.microsoft.com/en-us/library/ms978378.aspx)
Pour plus d'informations générales sur ASP.NET, reportez-vous au groupe de discussion MSDN suivant :
microsoft.public.dotnet.framework.aspnet (http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409)

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft SQL Server 2000 Standard
  • Microsoft SQL Server 7.0 Standard
  • Microsoft SQL Server 2000 Édition 64 bits
Mots-clés : 
kbconfig kbhowtomaster kbsecurity kbweb KB301240
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.