IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Récupération des données d'un user après authentification Windows Form C# [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut Récupération des données d'un user après authentification Windows Form C#
    Bonjour je travail sur un projet en c# et il faut dire que je débute.
    je dispose de 3 forms : Form_login, Form_Inscription, Form_PageClient et une Base de Données Access.
    Je voudrait que quand le client entre son nom utilisateur et mot de passe sur Form_login,
    les infos de l'user qui s'est deja inscris sur Form_Inscription soit recuperer depuis la base access,
    et afficher dans Form_PageClient comme suit :
    Nom, Prenom , Sexe, DateNaissance etc.

    Mon probleme se situe au niveau de la recuperation des données a faire passer sur form_PageClient
    en fonction de l'User et le mot de passe sur Form_login.

    Merci je joins mon bout de code pour analyse.
    MainForm.cs

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Il faut fournir le code de l'utilisateur connecté à ta page Form_PageClient et refaire une requête pour lire ses infos.

    Plusieurs remarques :
    1. Passer par une requête paramétrée.
    Si je tape "' or 1=1 /*" dans l'une de tes zones de saisies, je peux rentrer sans connaître le mot passe

    2. Ta requête recherche un membre avec un login et et un mot de passe précis. Du coup les tests que tu fais dans la boucle while sont inutiles.
    Une meilleure pratique est de rechercher uniquement sur le login et d'avoir un mot de passe hashé.
    Si tu ne trouve pas d'enregistrement pour le login, tu bloques
    Si le hash du password ne correspond pas au hash en base, tu bloques
    Ne jamais dire si c'est le login ou le mot de passe qui n'est pas bon. Toujours dire qu'au moins l'un des deux est incorrect sans dire lequel

    3. Ta connexion est en dur et ne fonctionnera pas sur un autre poste que le tien.

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut
    Citation Envoyé par popo Voir le message
    Il faut fournir le code de l'utilisateur connecté à ta page Form_PageClient et refaire une requête pour lire ses infos.

    Plusieurs remarques :
    1. Passer par une requête paramétrée.
    Si je tape "' or 1=1 /*" dans l'une de tes zones de saisies, je peux rentrer sans connaître le mot passe

    2. Ta requête recherche un membre avec un login et et un mot de passe précis. Du coup les tests que tu fais dans la boucle while sont inutiles.
    Une meilleure pratique est de rechercher uniquement sur le login et d'avoir un mot de passe hashé.
    Si tu ne trouve pas d'enregistrement pour le login, tu bloques
    Si le hash du password ne correspond pas au hash en base, tu bloques
    Ne jamais dire si c'est le login ou le mot de passe qui n'est pas bon. Toujours dire qu'au moins l'un des deux est incorrect sans dire lequel

    3. Ta connexion est en dur et ne fonctionnera pas sur un autre poste que le tien.

    Merci Bien pour vos remarques , je constate que j'ai du boulot,

    1- Concernant les requêtes paramétrées j'ai du mal a comprendre véritablement leurs fonctionnement.
    Je sais bien qu'ils sont la clé de mon code mais ou les positionnées ?

    2-Pour la boucle While je fais aussi la même remarque.

    3-Pour la connexion ce n'est qu'un test , je compte créer une Base de Données MySql par la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    /*
     
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Data.OleDb;
    using System.Text;
    using System.Threading.Tasks;
    using System.Linq;
    using System.Data;
     
    namespace LeSphinx
    {
     
    	public partial class LeSphinx_Login : Form
    	{
     
    		public LeSphinx_Login()
    		{
     
    			//
    			// The InitializeComponent() call is required for Windows Forms designer support.
    			//
    			InitializeComponent();
     
     
    			//
    			// TODO: Add constructor code after the InitializeComponent() call.
    			//
    		}
     
    // **************Ma difficulté se touve dans ce bout de code
     
    		void UserVaLiderClick(object sender, EventArgs e)
    		{
    	// declaration des variables
    			//**verification de saisie des données authentification de  l'utilisateur**/
     
    			 string user = textBox1.Text;
    			 string mdp = textBox2.Text;
    			 int x = 0;
     
    				// connection a la base de donnée access
     
    			    OleDbConnection odc = new OleDbConnection();
    				odc.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\ASUS PC\Documents\SharpDevelop Projects\LeSphinx\KingBD1.accdb;Persist Security Info=False;";
    			    DataTable dt = new DataTable();
     
    			    // recherche dans la table les infos
     
    			    OleDbCommand cmd = new OleDbCommand("select membres_user,membres_mdp from membres where membres_user='" + textBox1.Text + "' and membres_mdp='" + textBox2.Text + "'", odc);
    			    OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
    			    cmd.Parameters.AddWithValue("@ membres_user", user);
    			    cmd.Parameters.AddWithValue("@ membres_mdp", mdp);
     
    			    // generer une exception erreur si probleme avec la base si probleme d'authenfication
    		 try 
    		{
     
     
    				    // ouvre la connection a la Base */
    			    	odc.Open();
    			        //accède a la table
    			        oda.Fill(dt);
     
    			        //parcours la listes des users
    			        OleDbDataReader or = cmd.ExecuteReader();
     
                    if (or.HasRows == true) 
     
                    {
                    		// test de l'user
                    	or.Read();
                    	if (or["membres_user"].ToString() == user)
                    	{
     
    // **************Je ne sais pas comment récuperer les infos (nom , prenom, etc)  du client ici , et comment une requete parametré peut m'aidé?
     
                    //affiche la page de l'utilisateur
     
                    LeSphinx_Profile lp = new LeSphinx_Profile();
    			    lp.Show();
     
    			    //si ok authentifier vider les textbox
    			    textBox1.Text="";
    			    textBox2.Text="";
     
     
                    }
                    else
                    {
                    		label1.Text= "User ou mot de passe incorrect";
                    }
     
     
                    }               	
                    }
     
     
    			    catch (Exception ex) 
    			    {
    			    	MessageBox.Show(ex.Message);
    			    }
    			    finally
    			    {
    			        odc.Close();
    			    }
     
     
    		}
    	}
    }

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Pour la requête paramétrée, il ne faut pas d'espace entre l'arobase et le nom du paramètre et surtout il faut s'en servir dans la requête :
    Note que cette requête reprend ton exemple, mais il faudrait rechercher sur le login uniquement et stocker un hash du password (point 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OleDbCommand cmd = new OleDbCommand("select membres_user,membres_mdp from membres where membres_user=@membres_user and membres_mdp=@membres_mdp", odc);
    OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
    cmd.Parameters.AddWithValue("@membres_user", user);
    cmd.Parameters.AddWithValue("@membres_mdp", mdp);
    Pour la connexion, que ce soit Access, MySQL ou tout autre SGBDR, ce n'est jamais une bonne idée de mettre la chaine de connexion en dur dans le code.
    Donc ma remarque reste la même.

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut
    Citation Envoyé par popo Voir le message
    Pour la requête paramétrée, il ne faut pas d'espace entre l'arobase et le nom du paramètre et surtout il faut s'en servir dans la requête :
    Note que cette requête reprend ton exemple, mais il faudrait rechercher sur le login uniquement et stocker un hash du password (point 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OleDbCommand cmd = new OleDbCommand("select membres_user,membres_mdp from membres where membres_user=@membres_user and membres_mdp=@membres_mdp", odc);
    OleDbDataAdapter oda = new OleDbDataAdapter(cmd);
    cmd.Parameters.AddWithValue("@membres_user", user);
    cmd.Parameters.AddWithValue("@membres_mdp", mdp);
    Pour la connexion, que ce soit Access, MySQL ou tout autre SGBDR, ce n'est jamais une bonne idée de mettre la chaine de connexion en dur dans le code.
    Donc ma remarque reste la même.

    Oulaaa !!! je commence a tourné un peu en rond

    1- Stp c'est quoi mettre "une chaine de connexion en dur dans un code", désolé je débute je le fais peut être sans le savoir.
    2- J'ai un peu fouiné après tes remarques jai essayé de passer des valeurs en paramètre " si on peut appeler ça comme ça,
    mais je suis me suis entrainer un peu mais je rencontre un autre problème
    "l'index se trouve en dehors des limites du tableau"
    j'ai crée une class que je met en paramètre pour récupérer mes infos sur l'utilisateur qui se connecte,
    lors du passage a la form Profile j'obtient cette erreur. "l'index se trouve en dehors des limites du tableau"

    Voici mes différents codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    namespace LeSphinx
    {
    	/// <summary>
    	/// Description of Client.
    	/// </summary>
    	public class Client
    	{
    		private string nom;
    		private string prénoms;
    		private string dateNais;
    		private string age;
     
    		public Client()
    		{}
     
     
    		public string Nom
    		{
    			get { return this.nom; }
    			set { this.nom = value; }
    		}
     
    		public string Prénoms
    		{
    			get { return this.prénoms; }
    			set { prénoms = value; }
    		}
     
    		public string DateNais
    		{
    			get { return this.dateNais; }
    			set { this.dateNais = value; }
     
    		}
    		public string Age
    		{
    			get { return this.age; }
    			set { this.age = value; }
    		}
    		}
     
    	}

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut
    Form "Page de connexion"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    		void UserVaLiderClick(object sender, EventArgs e)
    		{
    	// declaration des variables
    			//**verification de saisie des données authentification de  l'utilisateur**/
     
    			 string user = textBox1.Text;
    			 string mdp = textBox2.Text;
    			 int x = 0;
     
    				// connection a la base de donnée access
    				OleDbConnection odc = new OleDbConnection();
    			 odc.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\ASUS PC\Documents\SharpDevelop Projects\LeSphinx\KingBD1.accdb;Persist Security Info=False;";
    			 DataTable dt = new DataTable();
     
    			    // recherche dans la table les infos
     
    			    cmd = new OleDbCommand("select membres_user,membres_mdp from membres where membres_user='" + user + "' and membres_mdp='" + mdp + "'");
    			    cmd.Connection = odc;
    			    oda = new OleDbDataAdapter(cmd);
    			    cmd.Parameters.AddWithValue("@membres_user", user);
    			    cmd.Parameters.AddWithValue("@membres_mdp", mdp);
     
    			    // generer une exception erreur si probleme avec la base si probleme d'authenfication
    		 try 
    		{
     
    				    // ouvre la connection a la Base */
    			    	odc.Open();
    			        //accède a la table
    			        oda.Fill(dt);
     
    			        //parcours la listes des users
    			        or = cmd.ExecuteReader();
     
                    if (or.HasRows == true) 
     
                    {
                    		// test de l'user
                    		or.Read();
                    	if (or["membres_user"].ToString() == user)
                    	{
    						//Charger la page de l'utilisateur
    						Client c = new Client();
     
                    		// transfert des données de user
                    		c.Nom = or.GetString(1);
                    		c.Prénoms = or.GetString(2);
                    		//lp.DateNais = or.GetString(3);
                             //lp.Age = or.GetString(4);
     
    				        //affiche la page de l'utilisateur
    				        lp = new LeSphinx_Profile(c);
    				        lp.Show();
     
    			    //si authentifier vider les textbox
    			    user="";
    			    mdp="";
     
                    }
                    else
                    {
                    		label1.Text = "User ou mot de passe incorrect";
                    }	
                    }               	
                    }
     
     
    			    catch (Exception ex) 
    			    {
    			    	MessageBox.Show(ex.Message);
     
    			    }
    			    finally
    			    {
     
    			        odc.Close();
    			    }
     
     
    		}
    J'ai mis un point d'arret et l'erreur est généré a ce niveau
    "index se trouve en dehors des limites du tableau

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 02/08/2018, 13h50
  2. Réponses: 2
    Dernier message: 07/05/2010, 10h30
  3. récupération des données aprés le formatage
    Par jean sami dans le forum Windows
    Réponses: 2
    Dernier message: 20/05/2009, 10h55
  4. Réponses: 1
    Dernier message: 17/06/2008, 12h02
  5. Récupération des données après restauration du système avec Ghost
    Par digital prophecy dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 12/06/2007, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo