6/19/11

Sécurité en ASP.NET 2.0


1. Sécurité en ASP.NET 2.0

1.1.            Introduction

Chaque site Internet nécessite une certaine sécurité pour éviter tout problèmes. La nouvelle version d'ASP.NET 2.0 de Microsoft, se basant sur le Framework 2.0, permet une meilleure sécurité et simplifie la tâche du développeur. En effet, l'ASP.NET 2.0 est un nouveau langage de Web développement pouvant être qualifier de "Nouvelle génération". Elle fait partie des nouvelles innovations du WEB 2.0 (AJAX, ASP.NET 2.0...), la nouvelle génération des websites. Grâce à ce langage, nous allons pouvoir appliquer des autorisations d'accès à certaines pages/dossiers, implémenter une gestion d'utilisation sécurisée et cryptée par l'utilisation des Membership et roles.
L'ASP.NET  2.0 a été développé de tel sort qu'il falicite le développeur, en réduisant son temps de travail de 80%. En effet, l'ASP.NET 2.0 consiste vraissemblablement au VB en "Drag and Drop", d'où la hausse de productivité pour les sociétés qui utiliseront ce langage. Ce langage intègre, par ailleurs, de nouveaux composants tel que les thèmes et skins, les masterpages, les WebParts, la personalisation, les profils, et bien d'autres nouveautés.

1.2.            Le fichier de configuration: Web.config

Le fichier Web.config est un fichier XML permettant de gérer la configuration de votre Website ou application. Il se trouve en général à la racine du site et chaque sous dossiers peuvent contenir un fichier de configuration.
Par exemple si vous êtes sur IIS, vous avez la possibilité de placer un fichier web.config à la racine (C:\InetPub\wwwroot), ainsi que chaque sous dossiers de wwwroot.

Ce fichier permet de gérer plusieurs paramètres d'un site web, notamment les accès, les autorisations, les sessions, les mails, les erreurs ainsi que leur redirections etc...

Voici l'exemple d'un fichier web.config:
<?xml version="1.0"?>

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <appSettings/>
     <connectionStrings>
           <add name="xxxxxxx" connectionString="Data Source= xxxxxxx;Initial Catalog= xxxxxxx;Integrated Security=True" providerName="System.Data.SqlClient"/>
     </connectionStrings>
    <system.web>

           <machineKey validationKey='EB5219CAB5504274A423EB78718F3E56DC8848
AFA6025B6D740D46AA2394EBAD1BB9FE6BD9141A691A971
7CFEDC77FB2788BBBC2CD80CA6C3EE02ACF99B04BA5'
decryptionKey='685F5FA7DD04AEE2A3C203A55612D6
A1A366F37491BED4B5'  
validation='SHA1'/>

     <membership defaultProvider="MembershipSqlProvider">
           <providers>
                 <add name="MembershipSqlProvider"
                      type="System.Web.Security.SqlMembershipProvider"
                       connectionStringName=" xxxxxxx "
                       enablePasswordRetrieval="true"
                       passwordFormat="Encrypted"
                       applicationName=" xxxxxxx ">
                 </add>
           </providers>
     </membership>

     <roleManager enabled="true" defaultProvider="RoleManagerSqlProvider">
           <providers>
              <add connectionStringName=" xxxxxxx 
                   applicationName=" xxxxxxx "
                   name="RoleManagerSqlProvider"
                type="System.Web.Security.SqlRoleProvider" />
           </providers>
           </roleManager>
          
     <profile enabled="true">
       <providers>
          <add name="AspNetSqlProvider"
             type="System.Web.Profile.SqlProfileProvider"
           connectionStringName=" xxxxxxx ">
           </add>
     </providers>
     <properties>
     <add name="Cart" allowAnonymous="true" type="W2TM.Web.framework.Cart" provider="AspNetSqlProvider" serializeAs="Binary"/>
     </properties>
     </profile>

           <anonymousIdentification
            enabled="true"
            cookieName="ASPXANONYMOUS"
            cookieTimeout="20"
            cookiePath="/"
            cookieRequireSSL="false"
            cookieSlidingExpiration="true"
            cookieProtection="All"
            cookieless="UseCookies">
           </anonymousIdentification>

           <sessionState cookieless="UseCookies" mode="InProc"></sessionState>

           <compilation debug="true"/>

           <customErrors mode="Off" defaultRedirect="~/erreur.aspx"/>

           <authentication mode="Forms">
            <forms defaultUrl="default.aspx" 
                   loginUrl="login.aspx"
                   requireSSL="false"
                   protection="All">
             </forms>
           </authentication>

           <authorization>
                 <deny users="*" />
           </authorization>
          
    </system.web>
     <location path="admin">
           <system.web>
                 <authorization>
                       <allow roles="admin"/>
                 </authorization>
           </system.web>
     </location>
     <location path="erreur.aspx">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <location path="Default.aspx">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <location path="uploads">
           <system.web>
                 <authorization>
                       <allow users="*" />
                 </authorization>
           </system.web>
     </location>
     <location path="master">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <location path="fr">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <location path="en">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <location path="login.aspx">
           <system.web>
                 <authorization>
                       <allow users="?"/>
                 </authorization>
           </system.web>
     </location>
     <location path="images">
           <system.web>
                 <authorization>
                       <allow users="*"/>
                 </authorization>
           </system.web>
     </location>
     <system.net>
           <mailSettings>
                 <smtp>
                       <network host="localhost" />
                 </smtp>
           </mailSettings>
     </system.net>
</configuration>


 Ce fichier web.config est tiré d'un des sites Exemples. Tout au long de cet article vous apprendrez petit à petit comment sécuriser votre site par ce fichier de configuration XML.

1.3.            Utilisation des Memberships et rôles

1.3.1.                  Installation de la base

Avant toutes choses, les memberships et rôles s'utilisent obligatoirement avec une base de donnée (SQL Server, Acces, Oracle). Nous allons uniquement prendre le cas de SQL Server.

Pour SQL Server, il vous faut installer la base ASPNETDB (Framework 2.0) qui contient des tables, des procédures stockés, vous permettant d'utiliser les memberships, les rôles, les profiles et donc la personnalisation.
L'installation se trouve en général dans:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\aspnet_regsql.exe

Il vous suffit de lancer le programme, choisir si vous voulez créer une nouvelle base (ASPNETDB sera le nom de cette base) ou installer tous les composants dans une base existante.




Untitled1.png
Voici une petite partie de l'arborescence de votre base de donnée après installaton:
Untitled3.png


1.3.2.                  Memberships

A la différence des versions précédentes, l'ASP.NET 2.0 inclut une utilisation simple des memberships et rôles, grâce à l'implémentation des providers, nouveauté dans le .NET Framework 2.0, permettant un accès à différentes bases, de pouvoir contrôler et choisir où stocker des informations dans une base. Il existe différents providers possibles pour les memberships: Acces, SQL Server... voici un schéma montrant le modèle du provider et son fonctionnement:
06fig02.gif
Pour utiliser les memberships dans votre projets, vous devez obligatoirement modifier le fichier Web.config (ou modifier par l'intermédiaire du WSAT), en voici un exemple (entre les balises system.web):
<membership defaultProvider="MembershipSqlProvider">
<
providers>
<
add name="MembershipSqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="votre_ConnectionString" enablePasswordRetrieval="true" passwordFormat="Encrypted" applicationName="nom_application">
</
add>
</
providers>
</
membership>


Les memberships peuvent s'utiliser dans le code-behind, en utilisant la classe membership qui est composée de méthodes statiques, ne nécessitant aucune instance de classe.
Voici une liste non-exhaustive de méthode:
Création d'un utilisateur (deux manières):
Membership.CreateUser(username, password);
OU
MembershipCreateStatus
status;
MembershipUser newuser = Membership.CreateUser(stringLogin, stringPassword, stringMail, stringQuestion, stringReponse, true, out status);
Suppréssion un utilisateur:
Membership.DeleteUser(username);

Validité d'un utilisateur:
Membership.ValidateUser(username, password);

Chercher un utilisateur par son mail:
Membership.FindUsersByEmail(email);

Afficher tous les utilisateurs:
Membership.GetAllUsers();

Il vous suffit de tapper "Membership" dans le code-behind (*.aspx.cs), vous pourrez apercevoir par auto-complétion toutes les méthodes de cette classe. Bien entendu toutes ces méthodes peuvent être générer automatiquement en utilisant les contrôles de Login, qui consiste simplement à du Drag and Drop.
Voici un exemple simple d'un formulaire d'inscription en utilisant la class membership:
Login: <asp:TextBox ID="TBox_Login"
                  runat="server"></asp:TextBox><br />
Password:<asp:TextBox ID="TBox_Pwd"
                  runat="server"></asp:TextBox><br />
<br />
<asp:Button ID="Bt_Register" runat="server" OnClick="Bt_Register_Click" Text="S'inscrire" /></div>



protected sub Bt_Register_Click(object sender, EventArgs e)
   
      Membership.CreateUser(TBox_Login.Text, TBox_Pwd.Text)
    End sub



1.3.3.                  Rôles

Les rôles consistent à regrouper les utilisateurs par groupes, par exemples les administrateurs dans le rôle "admin", les utilisateurs inscrits dans le rôle "user". L'utilité des rôles est de pouvoir contrôler un grand nombre d'utilisateur par l'intermédiaire d'un nom: le nom du rôle. Il vous faut cependant, activer les rôles, soit dans le WSAT, soit dans le web.confg comme ci-dessous.
<roleManager enabled="true" defaultProvider="RoleManagerSqlProvider">
<providers>
<add connectionStringName="votre_ConnectionString" applicationName="royal_fleur" name="RoleManagerSqlProvider" type="System.Web.Security.SqlRoleProvider" />
</providers>
</roleManager>
Comme pour les memberships, ils existent des classes pouvant utiliser les rôles, la principale classe est "roles".
Voic quelques exemples de méthodes pouvant être utiliser:

Création d'un rôle:
Roles.CreateRole(nom);
Suppréssion d'un rôle:
Roles.DeleteRole(nom);
Ajout d'un utilisateur à un rôle:
Roles.AddUserToRole(username, rolename);
Suppréssion d'un utilisateur d'un rôle:
Roles.RemoveUserFromRole(username, rolename);
Les rôles, ainsi que les memberships, peuvent être configurer avec le WSAT.




0 التعليقات:

Post a Comment

Related Posts Plugin for WordPress, Blogger...