begin process at 2008 05 17 05:20:21
1 173 912 membres
44 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ASP .NET 1.1 : AUTHENTIFICATION PAR FORMULAIRE


Information sur le tutorial

Catégorie :ASP.Net Tutorial .NET ( DotNet ) Date de création : 26/09/2006 01:17:01 Vu : 9 439 fois

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Au menu :

Mot de passe non crypté
Mot de passe crypté
Mot de passe crypté et stocké dans une base de données SQL Server.

Tutorial

ASP .NET 1.1 : Authentification par formulaire

 

Cet article date de 2003, quand mon site dyt4concept.com était ouvert, maintenant afin que les sources ne soient pas perdues, permettez moi de vous faire profiter de mon maigre savoir.

Ce projet a été créé pour .NET 1.1, il y a encore des gens qui ne sont pas passés à .NET 2.

Bonne lecture et à bientôt sur http://www.neldim.fr

Si vous souhaitez avoir la version PDF de cet article c'est ici : http://neldim.fr/files/folders/articles/entry2080.aspx

 

L'authentification par formulaire repose comme il se doit sur un nom d'utilisateur et un mot de passe. Il est avantageux d'ajouter aussi un rôle mais j'en parlerai en fin d?article.

Au menu :

  1. Mot de passe non crypté
  2. Mot de passe crypté
  3. Mot de passe crypté et stocké dans une base de données SQL Server.

Le mot de passe n'est pas crypté

 

Commençons par créer deux pages default.aspx et login.aspx, qui sont respectivement la page d'accueil et page de connexion :

default.aspx :

< % @ Page language = "C#" % >
<
% @ Import Namespace = "System.Web.Security" % >

<
script runat = "server" >
    
void Page_Load ( object sender , EventArgs e )
    
{
        
if ( User . Identity . IsAuthenticated )
        
{
            
lnkLogout . Visible = true ;
            
lblMsg . Text = "Bonjour : " + User . Identity . Name ;
        
}
        
else
        
{
            
lblMsg . Text = "Vous n'êtes pas authentifié" ;
        
}
    
}

    
void logOut ( object sender , EventArgs e )
    
{
        FormsAuthentication
. SignOut ();
        Response
. Clear ();
        Response
. Redirect ( Request . UrlReferrer . ToString ());
    
}
<
/ script >
<
body >
<
form runat = "server" >

<

asp : LinkButton id = "lnkLogout" Text = "Déconnexion" Visible = "false" OnClick = "logOut" runat = "server" />

>

<

asp : label id = "lblMsg" Text = "" runat = "server" /> >
<
/ form >
<
/ body >

Comme il se doit nous appelons le namespace System.Web.Security et nous testons si l'utilisateur est identifié ou non, dans l'affirmative nous lui donnons accès à un lien qui lui permettra de se déconnecter.

Maintenant tout se joue dans le web.config que je vais réduire au maximum :

Le mot de passe est crypté

 

Il existe deux modes de cryptage le MD5 et le SHA1 ce dernier étant le plus recommandé.

Pour en savoir plus sur SHA1 (Secure Hash Algorithm version 1.0) : http://www.w3.org/PICS/DSig/SHA1_1_0.html
Pour en savoir plus sur MD5 (Message-Digest Algorithm) : http://theory.lcs.mit.edu/~rivest/rfc1321.txt

Avant tout, il va falloir spécifié ces mots de passe cryptés dans le web.config aussi nous allons créer une petite page qui nous cryptera nos mots de passe, soit en utilsant MD5 soit en utilisant SHA1 :o)

Cette fois c'est vraiment très simple quelques lignes suffisent : cryptIt.aspx



< % @ Page language = "C#" % >
<
% @ Import Namespace = "System.Web.Security" % >

<
script runat = "server" >
    
void cryptIt ( object sender , EventArgs e )
    
{
        
string strFormat , strHash ;
        
if ( sha1 . Checked )
        
{
            
strFormat = sha1 . Text ;
        
}
        
else
        
{
            
strFormat = md5 . Text ;
        
}
        
strHash = FormsAuthentication . HashPasswordForStoringInConfigFile ( txtPwd . Text , strFormat );
        
txtResult . Text = "Mot de passe crypté : " + strHash + "    Cryptage : " + strFormat ;
    
}
<
/ script >

<
body >
<
form runat = "server" >
    

Format

du mot de passe : < asp : RadioButton id = "sha1" Text = "SHA1" GroupName = "groupFormat" Checked = "true" runat = "server" />  

>
    

Mot

de passe à crypter : < asp : TextBox id = "txtPwd" runat = "server" /> >
    


    <

asp : button id = "btnCrypt" Text = "Crypter" OnClick = "cryptIt" runat = "server" /> >
    

<

asp : label id = "txtResult" Text = "" ForeColor = "red" runat = "server" /> >
<
/ form >
<
/ body >

 

On le voit tout repose sur HashPasswordForStoringInConfigFile.

Dans notre cas les deux mots de passe seront :

Clear

MD5

SHA1

thor

575E22BC356137A41ABDEF379B776DBA

14051859736DD70525AF7CBBBADFB687C175CA12

odin

E44985980C9D3C5D70B6A548B14D773A

A12BF2C17C422ACCCB707FA811F07E743A9293D8

Maintenant nous pouvons remplir le web.config :

< ? xml version = "1.0" encoding = "utf-8" ? >
<
configuration >
<
system . web >
    <
authentication mode = "Forms" >
        <
forms name = "secure2" path = "/" loginUrl = "login.aspx" protection = "All" timeout = "30" >
            <
credentials passwordFormat = "SHA1" >
                <
user name = "david" password = "14051859736DD70525AF7CBBBADFB687C175CA12" / >
                <
user name = "dimitri" password = "A12BF2C17C422ACCCB707FA811F07E743A9293D8" / >
            <
/ credentials >
        <
/ forms >
    <
/ authentication >

    <
authorization >
        <
allow users = "david,dimitri" / >
        <
deny users = "*" / >
    <
/ authorization >
<
/ system . web >
<
/ configuration >

J'ai choisi SHA1 mais pour MD5 il suffit de changer passwordFormat et les mots de passe.

Maintenant dans la page login.aspx, c'est relativment simple : on garde la même que la précédente ;o) à savoir :

< % @ Page language = "c#" % >
<
% @ Import Namespace = "System.Web.security" % >

<
script runat = "server" >
    
void logIn ( object sender , EventArgs e )
    
{
        
if ( FormsAuthentication . Authenticate ( txtUsername . Text , txtPassword . Text ))
        
{
            FormsAuthentication
. RedirectFromLoginPage ( txtUsername . Text , chkPersist . Checked );
        
}
        
else
        
{
            
lblError . Text = "Erreur nom / mot de passe" ;
        
}
    
}
<
/ script >

    <
body >
        <
form id = "Form1" method = "post" runat = "server" >
            

Nom d'

utilisateur :
                <
asp : TextBox id = "txtUsername" runat = "server" >< /asp:TextBox>

>
            

Mot

de passe :
                <
asp : TextBox id = "txtPassword" runat = "server" TextMode = "Password" >< /asp:TextBox> >
            


                <

asp : CheckBox id = "chkPersist" runat = "server" Text = "Se souvenir du mot de passe" >< /asp:CheckBox> >
            


                <

asp : Button id = "Button1" runat = "server" Text = "Login" OnClick = "logIn" >< /asp:Button> >
            


                <

asp : label id = "lblError" Text = "" runat = "server" ForeColor = "red" /> >
        <
/ form >
    <
/ body    

Jusqu'à présent les mots de passe et les noms d'utilisateurs étaient stockées dans le web.config, maintenant nous allons les stocker dans une base de données.

 

Authentification via une base de données

 

Nous allons créer une table tblUsers contenant deux champs : username et password. Les mots de passe sont cryptés (SHA1) !

Ensuite nous écrivons le web.config :

< configuration >
    <
system . web >
        <
authentication mode = "Forms" >
            <
forms name = "secure7" path = "/" loginUrl = "login.aspx" protection = "All" timeout = "30" >
            <
/ forms >
        <
/ authentication >
        <
authorization >
            <
deny users = "?" / >
        
< / authorization >
    <
/ system . web >
<
/ configuration >

Ceci fait créons la page par défaut : default.aspx :

< % @ Page language = "C#" % >
<
% @ Import Namespace = "System.Web.Security" % >

<
script runat = "server" >
    
void Page_Load ( object sender , EventArgs e )
    
{
        
if ( User . Identity . IsAuthenticated )
        
{
            
lnkLogout . Visible = true ;
            
lblMsg . Text = "Bonjour : " + User . Identity . Name ;
        
}
        
else
        
{
            
lblMsg . Text = "Vous n'êtes pas authentifié" ;
        
}
    
}

    
void logOut ( object sender , EventArgs e )
    
{
        FormsAuthentication
. SignOut ();
        Response
. Clear ();
        Response
. Redirect ( Request . UrlReferrer . ToString ());
    
}
<
/ script >
<
body >
<
form runat = "server" >

<

asp : LinkButton id = "lnkLogout" Text = "Déconnexion" Visible = "false" OnClick = "logOut" runat = "server" />

>

<

asp : label id = "lblMsg" Text = "" runat = "server" /> >
<
/ form >
<
/ body >

Et oui c'est toujours la même :o)

Maintenant la page login.aspx.

Comme les mots de passes sont cryptés pour pouvoir vérifier leur cohérence avec la saisie il nous faut crypter la saisie et comparer les deux valeurs crypter pour voir si elles concordent.

Ce qui se fera par l'intermédiaire de HashPasswordForStoringInConfigFile(...) :

         string strPwd = txtPwd . Text ;

        
string strHash = FormsAuthentication . HashPasswordForStoringInConfigFile ( strPwd , "SHA1" );

Le reste est la même chose que vous trouverez dans l'article "tester l'existence d'un enregistrement" qui sera bientot publié.

Ce qui nous donne :

< % @ Page language = "C#" % >
<
% @ Import Namespace = "System.Data" % >
<
% @ Import Namespace = "System.Data.SqlClient" % >


<
script runat = "server" >
    
void DoLogin ( object sender , EventArgs e )
    
{
        
string strConn = "server=localhost;uid=sa;pwd=;database=devdyt;" ;
        
string strUsr = txtUsr . Text ;
        
string strPwd = txtPwd . Text ;

        
string strHash = FormsAuthentication . HashPasswordForStoringInConfigFile ( strPwd , "SHA1" );

        
bool blnIsAuthenticated = false ;

        
string strSql = "select password from usertable where username='" + strUsr + "' and password='" + strHash + "'" ;
        SqlConnection
myConn = new SqlConnection ( strConn );
        SqlCommand
myCommand = new SqlCommand ( strSql , myConn );
        
myConn . Open ();
        SqlDataReader
dr = myCommand . ExecuteReader ();

        
if ( dr . Read ())
        
{
            
blnIsAuthenticated = true ;
        
}
        
dr . Close ();
        
myConn . Close ();
        
        
if ( blnIsAuthenticated )
        
{
            FormsAuthentication
. RedirectFromLoginPage ( txtUsr . Text , chkPersist . Checked );
        
}
        
else
        
{
            
lblResult.Text= "Erreur de login" ;
        
}
    
}
<
/ script >

<
body >
<
form runat = "server" >
    

Nom d'

utilsateur : < asp : TextBox id = "txtUsr" type = "Text" runat = "server" />

>
    

Mot

de passe : < asp : TextBox id = "txtPwd" type = "Password" runat = "server" /> >
    

<

asp : CheckBox id = "chkPersist" runat = "server" />Retenir le mot de passe >
    

<

input type = "submit" value = "Login" runat = "server" OnServerClick = "DoLogin" /> >
    

<

asp : label id = "lblResult" Text = "" runat = "server" /> >
<
/ form >
<
/ body >

 

Cette fois nous allons ajouter à notre système d'authentification un rôle par utilisateur.
 
Objectif

Soit deux rôles : Admin et Junior, il faut que lorsque l'utilisateur se connecte il soit rediriger vers un dossier qui lui soit attibué, par exemple dossier Junior pour le rôle du même nom et Admin pour le rôle du même nom, il faut aussi empêcher les utilisateurs "Junior" d'accéder aux répertoires admins.
Pour commencer, nous allons créer une petite table dont voilà la structure :

CREATE TABLE dbo.RolesAndUsers
    (
    username nvarchar(50) NOT NULL,
    password nvarchar(50) NOT NULL,
    role nvarchar(50) NOT NULL
    ) ON [PRIMARY]
GO
ALTER TABLE dbo.RolesAndUsers ADD CONSTRAINT
    PK_RolesAndUsers PRIMARY KEY CLUSTERED
    (
    username
    ) ON [PRIMARY]

GO


J'ai repris les données de l'exemple précédent et les mots de passe sont toujours cryptés (SHA1).
Donc il faut créer maintenant un dossier racine (peut importe le nom, ce sera la racine du répertoire virtuel) et deux dossiers Junior et Admin.

 

Création de l'application de base

 

Commencons par le répertoire racine, qui ne contiendra que quatre fichiers : default.aspx, login.aspx, global.asax et web.config.

Le répertoire de base

 

Le web.config est relativement simple et on retrouve les même choses que dans l'article précédent, à savoir authorisé tous les membres identifiés et rejeter les autres.

 



    

    
        
    


    
        
        
    


Maintenant la page default.aspx, elle est relativement courte car elle ne va servir que de redirecteur. Elle teste le rôle de l'utilisateur et le redirige vers le répertoire idoine :

]]>
]]>



Voilà ce n'est pas très compliqué, ceci est un résumé de la mise en oeuvre de l'authenfication que j'ai pu créer en décortiquant le code des StaterKits et autres exemples de portails :)

PS : il existe deux autres manières de sécuriser les répertoires, la première en indiquant dans le web.config les autorisations comme ceci :
 

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<system.web>
     <authentication mode="Forms" >
        <forms name=".ASPXNET" loginUrl="login.aspx" protection="All" timeout="30" path="/"/>
     </authentication>

    <authorization>
        <deny users="?" />
        <allow users="*"/>
    </authorization>
</system.web>
<location path="Admin">
    <system.web>
        <authorization>
            <allow roles="Admin"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>
<location path="Junior">
    <system.web>
        <authorization>
            <allow roles="Admin,Junior"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>
</configuration>


La seconde en créant dans chaque répertoire un web.config avec les autorisations idoines, par exemple pour admin :


il suffit de placer ce web.config dans le dossier Admin :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
    <authorization>
        <allow roles="Admin"/>
        <deny users="*" />
    </authorization>
</system.web>
</configuration>


et pour le dossier Junior :
il suffit de placer de web.config dans ce dossier :

&