Comment : implémenter une simple authentification par formulaire
Mise à jour : novembre 2007
L'exemple de cette rubrique présente une implémentation simple d'authentification par formulaire ASP.NET. Il illustre les grandes lignes de l'authentification par formulaire lors de la connexion des utilisateurs à une application ASP.NET.
Remarque : |
---|
Si vous souhaitez recourir à l'authentification par formulaire, une méthode pratique consiste à utiliser l'appartenance (membership) d'ASP.NET et les contrôles de connexion ASP.NET. L'appartenance d'ASP.NET offre un moyen de stocker et de gérer des informations utilisateur et inclut des méthodes permettant d'authentifier des utilisateurs. Les contrôles de connexion ASP.NET utilisent l'appartenance d'ASP.NET et encapsulent la logique requise pour inviter les utilisateurs à indiquer leurs informations d'identification, valider les utilisateurs, récupérer ou remplacer des mots de passe, etc. En fait, l'appartenance d'ASP.NET et les contrôles de connexion ASP.NET fournissent une couche d'abstraction pour l'authentification par formulaire et se chargent de pratiquement toutes les tâches à effectuer pour utiliser l'authentification par formulaire. Pour plus d'informations, consultez Gestion des utilisateurs à l'aide de l'appartenance et Vue d'ensemble des contrôles de connexion ASP.NET. |
Dans le scénario de l'exemple, les utilisateurs demandent une ressource protégée, à savoir une page nommée Default.aspx. Un seul utilisateur a accès à la ressource protégée : jchen@contoso.com, avec le mot de passe "37Yj*99P". Le nom d'utilisateur et le mot de passe sont codés en dur dans le fichier Logon.aspx. L'exemple nécessite trois fichiers : le fichier Web.config, une page nommée Logon.aspx, et une page nommée Default.aspx. Les fichiers résident dans le répertoire racine de l'application.
Pour configurer l'application pour l'authentification par formulaire
Si l'application possède un fichier Web.config dans son dossier racine, ouvrez-le.
Si l'application n'a pas encore de fichier Web.config dans son dossier racine, créez un fichier texte nommé Web.config et ajoute-lui les éléments suivants :
<?xml version="1.0"?> <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> </system.web> </configuration>
Dans l'élément system.web, créez un élément authentication et affectez à son attribut mode la valeur Forms, comme l'illustre l'exemple suivant :
<system.web> <authentication mode="Forms"> </authentication> </system.web>
Dans l'élément authentication, créez un élément forms et définissez les attributs suivants :
loginUrl Affectez-lui la valeur "Logon.aspx". Logon.aspx est l'URL à utiliser pour la redirection si ASP.NET ne trouve pas de cookie d'authentification avec la demande.
name Affectez-lui la valeur "ASPXFORMSAUTH". Cette valeur définit le suffixe du nom du cookie qui contient le ticket d'authentification.
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> </system.web>
Dans l'élément system.web, créez un élément authorization.
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> </authorization> </system.web>
Dans l'élément authorization, créez un élément deny et affectez "?" à son attribut users. Cela indique que les utilisateurs non authentifiés (représentés par "?") se voient refuser l'accès aux ressources de cette application.
<system.web> <authentication mode="Forms"> <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> <deny users="?" /> </authorization> </system.web>
Enregistrez le fichier Web.config et fermez-le.
Création de la page de connexion
Lorsque les utilisateurs demandent une page quelconque du site Web et s'ils n'ont pas été précédemment authentifiés, ils sont redirigés vers une page nommée Logon.aspx. Vous avez spécifié ce nom de fichier plus haut dans le fichier Web.config.
La page Logon.aspx collecte les informations d'identification de l'utilisateur (adresse de messagerie et mot de passe) et les authentifie. Si l'utilisateur est authentifié, la page de connexion redirige l'utilisateur vers la page initialement demandée. Dans l'exemple, les informations d'identification valides sont codées en dur dans le code de page.
Note de sécurité : |
---|
Cet exemple contient une zone de texte qui accepte l'entrée d'utilisateur, ce qui constitue une menace éventuelle pour la sécurité. Par défaut, les pages Web ASP.NET vérifient que les entrées d'utilisateur n'incluent pas de script ou d'éléments HTML. Pour plus d'informations, consultez Vue d'ensemble des attaques de script. |
Pour créer la page de connexion
Créez une page ASP.NET nommée Logon.aspx dans le dossier racine de l'application.
Copiez la balise suivante et codez-y ce qui suit :
<%@ Page Language="VB" %> <%@ Import Namespace="System.Web.Security" %> <script > Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs) If ((UserEmail.Text = "jchen@contoso.com") And _ (UserPass.Text = "37Yj*99Ps")) Then FormsAuthentication.RedirectFromLoginPage _ (UserEmail.Text, Persist.Checked) Else Msg.Text = "Invalid credentials. Please try again." End If End Sub </script> <html> <head id="Head1" > <title>Forms Authentication - Login</title> </head> <body> <form id="form1" > <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" /> <p> <asp:Label ID="Msg" ForeColor="red" /> </p> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Security" %> <script > void Logon_Click(object sender, EventArgs e) { if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps")) { FormsAuthentication.RedirectFromLoginPage (UserEmail.Text, Persist.Checked); } else { Msg.Text = "Invalid credentials. Please try again."; } } </script> <html> <head id="Head1" > <title>Forms Authentication - Login</title> </head> <body> <form id="form1" > <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" /> <p> <asp:Label ID="Msg" ForeColor="red" /> </p> </form> </body> </html>
La page contient des contrôles serveur ASP.NET qui collectent les informations utilisateur ainsi qu'une case à cocher sur laquelle les utilisateurs peuvent cliquer pour rendre leurs informations d'identification de connexion persistantes. Le gestionnaire Click du bouton Connexion contient du code qui compare l'adresse de messagerie et le mot de passe de l'utilisateur à des valeurs codées en dur. (Le mot de passe est un mot de passe fort qui contient divers caractères non alphabétiques et est composé de huit caractères au moins.) Si les informations d'identification de l'utilisateur sont correctes, le code appelle la méthode RedirectFromLoginPage de la classe FormsAuthentication, en passant le nom de l'utilisateur et une valeur de type Boolean (dérivée de la case à cocher) qui indique s'il faut rendre un ticket d'authentification persistant sous forme de cookie. La méthode redirige l'utilisateur vers la page initialement demandée. Si les informations d'identification de l'utilisateur ne correspondent pas, un message d'erreur est affiché. Notez que la page importe l'espace de noms System.Web.Security qui contient la classe FormsAuthentication.
Création de la page par défaut
Pour l'exemple, vous créez une page ASP.NET dans le dossier racine de l'application. Dans la mesure où vous avez spécifié dans le fichier de configuration que tous les utilisateurs non authentifiés se voient refuser l'accès aux ressources ASP.NET de l'application (lesquelles incluent des fichiers .aspx, mais pas des fichiers statiques tels que les fichiers HTML ou multimédias dont les images, de la musique, etc.), lorsqu'un utilisateur demande la page, l'authentification par formulaire vérifie les informations d'identification de l'utilisateur et redirige celui-ci vers la page de connexion si nécessaire. La page que vous créez autorise également des utilisateurs à se déconnecter, ce qui efface leur ticket d'authentification (cookie) rendu persistant.
Pour créer une page par défaut
Créez une page ASP.NET nommée Default.aspx dans le dossier racine de l'application.
Copiez la balise suivante et codez-y ce qui suit :
<%@ Page Language="VB" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script > Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs) Welcome.Text = "Hello, " & Context.User.Identity.Name End Sub Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs) FormsAuthentication.SignOut() Response.Redirect("Logon.aspx") End Sub </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" /> <form id="Form1" > <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" /><p> </form> </body> </html>
<%@ Page Language="C#" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script > void Page_Load(object sender, EventArgs e) { Welcome.Text = "Hello, " + Context.User.Identity.Name; } void Signout_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Logon.aspx"); } </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" /> <form id="Form1" > <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" /><p> </form> </body> </html>
La page affiche l'identité authentifiée de l'utilisateur, laquelle a été définie par la classe FormsAuthentication et est disponible dans une page ASP.NET en tant que propriété Context.User.Identity.Name. Le gestionnaire Click du bouton Déconnexion contient du code qui appelle la méthode SignOut pour effacer l'identité de l'utilisateur et supprimer le ticket d'authentification (cookie). Il redirige ensuite l'utilisateur vers la page de connexion.
Voir aussi
Concepts
Méthodes de sécurité de base pour les applications Web
Référence
Vue d'ensemble des contrôles de connexion ASP.NET