vendredi 23 décembre 2011

Authentification par formulaire ASP.NEt

1. Contexte

Plusieurs jours de galère, cherchant voies et moyens pour sécuriser une application web créée au sein de l'entreprise ont abouti à une solution exploitable. Je me suis proposé de partager cette expérience à travers ces écrits afin que autres personnes ne puissent pas perdre le temps comme moi.    
 
En effet, le mode d'authentification par formulaire consiste à rediriger tout utilisateur vers une page de login tant que celui-ci ne s'est pas authentifié. L'authentification peut-être réalisée soit à partir d'un fichier de configuration XML soit à partir d'un système externe (SGBD ou Active Directory). Dans notre cas , nous avons utilisé  un mode mixte : authentification à travers Active Directory et contrôle du rôle de l’utilisateur dans la base des données.
 

L'authentification par formulaire vous offre un moyen d'authentifier des utilisateurs à l'aide de votre propre code puis de conserver un jeton d'authentification dans un cookie ou dans l'URL de la page. L'authentification par formulaire participe au cycle de vie de la page ASP.NET via le module FormsAuthenticationModule.

Pour utiliser l'authentification par formulaire, vous créez une page de connexion qui collecte les informations d'identification de l'utilisateur et inclut le code servant à authentifier ces informations. Si les informations d'identification sont correctes, vous pouvez appeler des méthodes de la classe FormsAuthentication pour rediriger la demande vers la ressource demandée initialement à l'aide d'un ticket d'authentification approprié (cookie). 

Fichiers sources
Les fichiers sources sont : Login.aspx, Login.aspx.cs, Site.Master.aspx, Site.Master.aspx.cs, Global.asax, web.config

1. Login.aspx


 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="MGP2.Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <link href="Styles/Style_Authentification.css" rel="stylesheet" type="text/css" /> 
<script src="Scripts/popup.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
 
    <div runat="server" id="Div_Info" class="info_application" visible="false">
          
    </div>
      <div class="error_message">
         <asp:Label ID="Error_Message_Auth" runat="server" Text=""></asp:Label>
     </div>
    <div class="cadre_principal">
   
        <div class="ligne_authentification">
            <div class="ligne_authentification_gauche"> Identifiant </div>
            <div class="ligne_authentification_droite">  <asp:TextBox ID="UserName" runat="server" CssClass="text_box_auth"></asp:TextBox> </div>
        </div>
        
        
         <div class="ligne_authentification">
            <div class="ligne_authentification_gauche"> Mot de passe </div>
            <div class="ligne_authentification_droite"> <asp:TextBox ID="Password" TextMode="Password" runat="server" CssClass="text_box_auth" ></asp:TextBox> </div>
        </div>
         <div>
         <div style="height:12px; width:240px; float:left"> </div>
          <div style="min-height:12px; width:190px; float:left">
            
            <asp:Button ID="Connect" OnClick="Connexion_System" runat="server" Text="Connexion" CssClass="bouton_connexion" />
 
           </div>
         </div>
      
        <div class="ligne_authentification" style="min-height:15px;">
            <div class="ligne_authentification_gauche"> </div>
            <div class="ligne_authentification_droite" style=" padding-top:8px;">
            <a href="javascript:PopupCentrer('Forgotten_Passwd.aspx',535,180,'menubar=no,scrollbars=no,statusbar=no')" class="forgotten_passwd">
            Mot de passe oublié ? </a>
            </div>
        </div>
         <div class="ligne_authentification_finale">
            <div class="ligne_authentification_gauche_finale"> </div>
            <div class="ligne_authentification_droite_finale" style=" padding-top:13px; ">
            
            <a href="javascript:PopupCentrer('Info.aspx',640,300,'menubar=no,scrollbars=no,statusbar=no')" title="Cliquer ici pour avoir plus d'information sur l'application" class="info">
            Plus d'info sur l'application
            </a>
           
          
            
            </div>
        </div>
    </div> 
    </form>
</body>
</html>




2. Login.aspx.cs

using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace MGP2
{
    public partial class Login : System.Web.UI.Page
    {
        SqlCommand myCommand;
        SqlDataReader myReader;
        SqlConnection myConnection;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Connexion_System(object sender, EventArgs e)
        {
            string Login = UserName.Text;
            string MotDePasse = Password.Text;

            try
            {

                //Verifions si l utilisateur existe dans le domaine

                DirectoryEntry Ldap = new DirectoryEntry("LDAP://OU=xxxx,DC=xx,DC=xxxx,DC=xxxxxx", Login,   
                MotDePasse);
                DirectorySearcher searcher = new DirectorySearcher(Ldap);
                searcher.Filter = "(&(objectClass=user)(sAMAccountName=" + UserName.Text + "))";
                SearchResult result = searcher.FindOne();
                DirectoryEntry DirEntry = result.GetDirectoryEntry();

                //Recuperons les informations relatives a l'utilisateur

                string Prenom = DirEntry.Properties["givenName"].Value.ToString();
                string Nom = DirEntry.Properties["sn"].Value.ToString();
                string Email = DirEntry.Properties["mail"].Value.ToString();

             
                //Verifions role et autres attributions de l'utilisateur dans la base des donnees

                myConnection = (SqlConnection)Session["Connecting"];
                string RqtSelect = string.Format("select * from USERS where EMAIL_USER='{0}'", Email);
                myCommand = new SqlCommand(RqtSelect, myConnection);
                myReader = myCommand.ExecuteReader();

                if (myReader.HasRows)
                {
                    while (myReader.Read())
                    {
                        string Loginame1 = myReader.GetString(1);
                        string Loginame2 = myReader.GetString(2);
                        string Loginmail = myReader.GetString(3);
                        string Phone = myReader.GetString(4);
                        Int32 RoleId = myReader.GetInt32(6);

                       //Mettons en sessions les infos utiles de l'utilisateur

                       Session["Login"] = UserName.Text;
                       Session["NomUtilisateur"] = string.Format("{0}", Nom);
                       Session["PrenomUtilisateur"] = string.Format("{0}", Prenom);
                       Session["EmailUtilisateur"] = Email;
                       Session["RoleUtilisateur"] = RoleId;

                       string Adresse_Electronique = Convert.ToString(Session["EmailUtilisateur"]);
                       FormsAuthentication.RedirectFromLoginPage(Adresse_Electronique, true);
                    }
                }

                myReader.Close();


            }
            catch (Exception ex)
            {
                Error_Message_Auth.Text = ex.Message;
            }
        }
    }
}



 3. Site.Master.aspx:

 <asp:Button ID="Quitter" OnClick="Quitter_Page" runat="server" Text="Logout" Width="113px" />
<br>
              
 <asp:Label ID="WellComeText" runat="server" Text=""></asp:Label>   
              
 4. Site.Master.aspx.cs


using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
namespace MGP2
{
    public partial class SiteMaster : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
            Load_Principal_Data();
            }
        }
        void Load_Principal_Data()
        {
            if (Session["EmailUtilisateur"]!= null)
            {
                WellComeText.Text = "Bienvenue" + Convert.ToString(Session["NomUtilisateur"]) + Convert.ToString(Session["PrenomUtilisateur"]);
            
            }
        
        }
        protected void Quitter_Page(object sender, EventArgs e)
        {
            
            //Session["Login"] = null;
            Session.Abandon();
            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();
        }
    }
}


5. Global.asax
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;

namespace MGP2
{
    public class Global : System.Web.HttpApplication
    {


        void Application_Start(object sender, EventArgs e)
        {
            // Code qui s'exécute au démarrage de l'application

        }

        void Application_End(object sender, EventArgs e)
        {
            //  Code qui s'exécute à l'arrêt de l'application

        }

        void Application_Error(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une erreur non gérée se produit

        }

       
        void Session_Start(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une nouvelle session démarre
            SqlConnection myConnection = new SqlConnection();
            //myConnection.ConnectionString = "Data Source=CDLPPOVERTY10;Initial Catalog=MR;Integrated Security=True";
            myConnection.ConnectionString = "Data Source=xxxxx;Initial Catalog=DataBaseName;User ID=xxxx;Password=xxxxxx";

            myConnection.Open();
            Session["Connecting"] = myConnection;
        }

        void Session_End(object sender, EventArgs e)
        {
            // Code qui s'exécute lorsqu'une session se termine.
            // Remarque : l'événement Session_End est déclenché uniquement lorsque le mode sessionstate
            // a la valeur InProc dans le fichier Web.config. Si le mode de session a la valeur StateServer
            // ou SQLServer, l'événement n'est pas déclenché.
            SqlConnection FermerConnexion = (SqlConnection)Session["Connecting"];
            FermerConnexion.Close();
        }

       

    }
}
 
6. web.config


<add name="MRConnectionString" connectionString="Data Source=xxxxx;Initial Catalog=xxx;User ID=xxxxxx;Password=xxxxx" providerName="System.Data.SqlClient" />

Dans le web.config je place seulement la ligne utilie

Ca marche !!!!

Si vous avez des difficultes a exploite ce code :
1. GIF (Google Is your Friend)
2. monsar04[at]gmail.com / 00243997647154

Aucun commentaire:

Enregistrer un commentaire