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

Traductions disponibles Traductions disponibles
Numéro d'article: 308157 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F308157
Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
Agrandir tout | Réduire tout

Sommaire

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 SQL Server
  • Microsoft Internet Information Services (IIS) version 5.0 ou ultérieure

Création d'une application ASP.NET à l'aide de Visual Basic .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. À partir du menu Démarrer de Windows, 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.vb).
  1. Ouvrez le fichier Logon.aspx.vb.
  2. Importez les espaces de noms requis dans le fichier code-behind :
    Imports System.Data.SqlClient
    Imports 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 Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
            Dim conn As SqlConnection
            Dim cmd As SqlCommand
            Dim lookupPassword As String
    
            lookupPassword = Nothing
    
            ' Vérifie la présence d'un userName non valide.
            ' userName ne doit pas avoir la valeur null et doit comprendre entre 1 et 15 caractères.
            If ((userName Is Nothing)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
            If ((userName.Length = 0) Or (userName.Length > 15)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
    
            ' Vérifie la présence de passWord non valide.
            ' passWord ne doit pas avoir la valeur null et doit comprendre entre 1 et 25 caractères.
            If (passWord Is Nothing) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
            If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
    
            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 = cmd.ExecuteScalar()
    
                ' Nettoie la commande et les objets de connexion.
                cmd.Dispose()
                conn.Dispose()
            Catch ex As Exception
                ' 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)
            End Try
    
            ' Si aucun mot de passe n'est trouvé, retourne false.
            If (lookupPassword Is Nothing) Then
                ' Vous pouvez écrire ici les échecs de tentative de connexion dans le journal des événements, pour une sécurité accrue.
                Return False
            End If
    
            ' Compare lookupPassword et le passWord d'entrée à l'aide d'une comparaison sensible à la casse.
            Return (String.Compare(lookupPassword, passWord, False) = 0)
    
    End Function
    					
  4. Deux méthodes peut ê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 Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles cmdLogin.ServerClick
         If ValidateUser(txtUserName.Value,txtUserPass.value) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
            chkPersistCookie.Checked)
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						
    • 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 Sub cmdLogin_ServerClick(ByVal sender As Object, _
         ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
         If Validateuser(txtUserName.Value,txtUserPass.Value) Then
            Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie
      
            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) then ck.Expires=tkt.Expiration 
            ck.Path = FormsAuthentication.FormsCookiePath() 
            Response.Cookies.Add(ck)
      
            Dim strRedirect As String
            strRedirect = Request("ReturnURL")
            If strRedirect <> "" Then
               Response.Redirect(strRedirect, True)
            Else
               strRedirect = "default.aspx"
               Response.Redirect(strRedirect, True)
            End If
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						

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">
    						
    Ce 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 :
    Imports System.Web.Security
    					
  5. Ouvrez la page code-behind (Default.aspx.vb) et copiez le code suivant dans le gestionnaire d'événements cmdSignOut_ServerClick :
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cmdSignOut.ServerClick
       FormsAuthentication.SignOut()
       Response.Redirect("logon.aspx", True)
    End Sub
    					
  6. Enregistrez et compilez le projet. Vous pouvez maintenant utiliser l'application.

Résolution des problèmes

  • 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 l'implémentation de l'authentification simple basée sur les formulaires à l'aide de la section <credentials> pour stocker des utilisateurs et des mots de passe, reportez-vous à l'article suivant dans les exemples de Démarrage rapide ASP.NET :
Authentification basée sur les formulaires (en anglais)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
Pour plus d'informations sur l'implémentation de l'authentification basée sur les formulaires à l'aide d'un fichier XML (Extensible Markup Language) 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
Pour plus d'informations sur la sécurité des applications Web ASP.NET, reportez-vous à l'article suivant dans la documentation du Kit de développement SDK .NET Framework :
Sécurité des applications Web ASP.NET (en anglais)
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 à l'article suivant dans la documentation du Kit de développement SDK .NET Framework (en anglais) :
http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm
Pour plus d'informations sur la configuration ASP.NET, reportez-vous aux articles suivants du Kit de développement SDK .NET Framework :
Configuration ASP.NET (en anglais)
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
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
Pour plus d'informations générales sur ASP.NET, reportez-vous au groupe de discussion MSDN suivant :
microsoft.public.dotnet.framework.aspnet
Pour plus d'informations, reportez-vous aux manuels suivants (en anglais uniquement) :
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET. Microsoft Press, 2001.

Howard, Michael and David LeBlanc. Writing Secure Code. Microsoft Press, 2001.

Propriétés

Numéro d'article: 308157 - Dernière mise à jour: lundi 29 octobre 2007 - Version: 8.8
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft SQL Server 2000 Standard
  • Microsoft SQL Server 7.0 Standard
Mots-clés : 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
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