Implémentation de l'authentification basée sur les formulaires dans votre application ASP.NET à l'aide de C#.NET

Traductions disponibles Traductions disponibles
Numéro d'article: 301240 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F301240
Agrandir tout | Réduire tout

Sommaire

Résumé

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

Conditions requises

La liste suivante met en évidence 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 en utilisant C# .NET

  1. Ouvrez Visual Studio .NET.
  2. Créez une application Web ASP.NET et indiquez son nom et son emplacement.

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

Cette section montre comment ajouter et modifier les sections de configuration <authentication> et <authorization> pour configurer l'application ASP.NET de manière à ce qu'elle utilise l'authentification basée sur les formulaires.
  1. Dans l'Explorateur de solutions, ouvrez le fichier Web.config.
  2. Définissez le mode d'authentification sur Formulaires.
  3. Insérez la balise <Forms> et complétez les attributs concernés. (Pour plus d'informations sur ces attributs, reportez-vous à la documentation MSDN ou QuickStart répertoriée dans la section RÉFÉRENCES.) Copiez le code suivant, puis cliquez sur Coller au format HTML dans le menu Edition afin de 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. Interdisez l'accès à un utilisateur anonyme dans la section <authorization> en procédant comme suit :
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

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

Cette section explique comment créer un exemple de base de données pour enregistrer le nom d'utilisateur, le mot de passe et le rôle des utilisateurs. Vous avez besoin de la colonne Rôle si vous souhaitez enregistrer les rôles utilisateur dans la base de données et implémenter une sécurité basée sur les rôles.
  1. Dans le menu Démarrer, cliquez sur Exécuter, puis tapez bloc-notes 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 le nom 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. Cela permet de créer un exemple de table des utilisateurs et de remplir 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 formulaire Web au projet Logon.aspx.
  2. Ouvrez la page Logon.aspx dans l'éditeur et basculez en mode HTML.
  3. Copiez le code suivant et utilisez l'option Coller au format HTML du menu Edition afin d'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 formulaire Web permet de présenter un formulaire d'ouverture de session aux utilisateurs pour qu'ils puissent fournir leur nom d'utilisateur et leur mot de passe et se connecter à l'application.
  4. Basculez en mode Création et enregistrez la page.

Codage du gestionnaire d'événements de manière à ce qu'il valide les informations d'identification des utilisateurs

Cette section présente le code placé sur la page code-behind (Logon.aspx.cs).
  1. Double-cliquez sur Ouverture de session pour ouvrir le fichier Logon.aspx.cs.
  2. Importez les espaces de noms nécessaires 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 (veillez à modifier la chaîne de connexion de façon à ce 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 la valeur 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 de ces méthodes, selon vos besoins.
    • 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 se connecter au préalable à 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">
    						
    Ce bouton permet de fermer la session d'authentification basée sur les formulaires.
  3. Basculez en mode Création et enregistrez la page.
  4. Importez les espaces de noms nécessaires 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 souhaitez peut-être stocker les mots de passe de manière sécurisée dans une base de données. Vous pouvez utiliser la fonction d'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 souhaitez 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 pouvez 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 la ligne 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 souhaitez 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 sur son navigateur.
  • Le paramètre timeout de la section de configuration <authentication> contrôle l'intervalle de régé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. Le fait que l'authentification basée sur les formulaires utilise un cookie pour authentifier les utilisateurs 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
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/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 logiciel .NET Framework :
Authentification basée sur les formulaires à l'aide d'un fichier d'utilisateurs XML
http://msdn.microsoft.com/fr-fr/library/1b1y85bh(vs.71).aspx
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
http://msdn.microsoft.com/fr-fr/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 de Microsoft .NET Framework suivante :
Espace de noms System.Web.Security
http://msdn.microsoft.com/fr-fr/library/system.web.security(vs.71).aspx
Pour plus d'informations sur la configuration ASP.NET, reportez-vous aux articles suivants du Guide de développement Microsoft .NET Framework :
Configuration ASP.NET
http://msdn.microsoft.com/fr-fr/library/aa719558(VS.71).aspx

Sections de configuration ASP.NET
http://msdn.microsoft.com/fr-fr/library/w7w4sb0w(vs.71).aspx
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
http://msdn.microsoft.com/fr-fr/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
Remarque Il s'agit d'un article de « PUBLICATION RAPIDE » rédigé directement au sein du service de support technique Microsoft. Les informations qui y sont contenues sont fournies en l'état, en réponse à des problèmes émergents. En raison du délai rapide de mise à disposition, les informations peuvent contenir des erreurs typographiques et, à tout moment et sans préavis, faire l'objet de révisions. Pour d'autres considérations, consultez les Conditions d'utilisation.

Propriétés

Numéro d'article: 301240 - Dernière mise à jour: vendredi 29 juin 2012 - Version: 1.0
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.

Envoyer des commentaires

 

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