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

Windows Forms Discussion :

[c#] Mot de passe sur application. Quelle solution utiliser?


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 86
    Points : 41
    Points
    41
    Par défaut [c#] Mot de passe sur application. Quelle solution utiliser?
    Bonjour à tout le monde,

    je voudrais faire une form qui demande un login et un mot de passe pour pouvoir travailler avec mon application.
    Ce login et mot de passe, je voudrais le mettre dans une base de données.
    Quelle est la meilleure solution pour faire ceci? Sans trop de complications bien sur?
    Faire un select * FROM users et regarder si ma requête ne me retourne qu'une seule ligne?

    Comment faire cela en c#?

    Merci de vos conseils

  2. #2
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Tu enregistre une valeur hashée du mot de passe en utilisant System.Security.Cryptography.HashAlgorithm.
    Si l'utilisateur perd sont mot de passe tu lui regenere un nouveau aléatoirement et tu lui donne la possibilité de le modifier.

    Pour info System.Security.Cryptography.KeyedHashAlgorithm est plus securisé, mais il faut dans ce cas garder la clé de hashage par exemple la hard coder.
    Mehdi Feki : Modérateur .Net

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    ça dépend du niveau de sécurité dont tu as besoin...

    tu peux simplement créer une table 'password', avec deux champs : 'profil' et 'pass'...

    pis dans ton form de connection, tu mets un combobox avec la liste des profil (ou un textbox si y a bcp d'utilisateurs...), pis un textbox pour entrer le pass (en ajoutant la propriété "hide text" pour que ce soit des points qui apparaissent...), puis à la validation (bouton 'connection'), tu compare la valeur entrée avec celle qui est stockée...

    si true> connect, si false > ciao bonne

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Ouais, heu ça se sera pour un stade ultérieur à mon application.
    Mais mon problème principal, pour l'instant c'est uniquement d'aller rechercher mon login et mon mot de passe dans la base de données.
    Pour l'instant, j'ai ceci, mais qui ne fonctionne pas : Je reçois une exception "ExecuteReader : connection non établie", un truc du genre.

    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
     
    public int Authentification(string login, string password)
            {
                try
                {
                    this.Ouvre_connexion();
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandText = "SELECT COUNT(login),password FROM users WHERE " +
                                        " login = @prm_login AND password = @prm_password";
                    SqlParameter prm_login = new SqlParameter("@prm_login",SqlDbType.Text);
                    prm_login.Value = login;
                    SqlParameter prm_password = new SqlParameter("@prm_password",SqlDbType.Text);
                    prm_login.Value = password;
                    cmd.Parameters.Add(prm_login);
                    cmd.Parameters.Add(prm_password);
                    SqlDataReader dr = cmd.ExecuteReader();
                    int nbr_lignes = 0;
                    while (dr.Read())
                        nbr_lignes++;
                    if (nbr_lignes == 1)
                        return 1;
                    else return 0;               
                }
                catch (Exception e)
                {
                    MessageBox.Show("Erreur de connexion" + e.Message);
                    return 0;
                }
            }

  5. #5
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par Zebeber
    Quelle est la meilleure solution pour faire ceci?
    Je ne comprends plus, tu veux qu'on te propose des soliutions ou tu veux qu'on te corrige ton code ?

    Pour ta deuxieme question j'ecrirais plutot comme ca la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     cmd.CommandText = "SELECT UserId FROM users WHERE " +
                                        " login = @prm_login AND password = @prm_password";
    //......
    if (dr.Read())
    //.......
    parce que je crois qu'il manque un groupe by dans la requete utilisant Count :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     cmd.CommandText = "SELECT COUNT(*),UserId FROM users WHERE " +
                                        " login = @prm_login AND password = @prm_password group by (UserId)";
    Mehdi Feki : Modérateur .Net

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Voilà, j'ai fait quelques modifs dans mon code, j'ai fait une requête paramétrée et maintenant cela fonctionne.

    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
     
    public int Authentification(string login, string password)
            {
                try
                {
                    this.Ouvre_connexion();
                    string requete = "SELECT login,password FROM users WHERE " +
                                        " login LIKE @prm_login AND password LIKE @prm_password";
                    SqlCommand cmd = new SqlCommand(requete,connexion);
                    cmd.CommandText = requete;
                    SqlParameter prm_login = new SqlParameter("@prm_login", SqlDbType.Text);
                    prm_login.Value = login;
                    SqlParameter prm_password = new SqlParameter("@prm_password", SqlDbType.Text);
                    prm_password.Value = password;
                    cmd.Parameters.Add(prm_login);
                    cmd.Parameters.Add(prm_password);
     
                    SqlDataReader dr = cmd.ExecuteReader();
                    int nbr_lignes = 0;
                    while (dr.Read())
                        nbr_lignes++;
                    if (nbr_lignes == 1)
                        return 1;
                    else return 0;               
                }
                catch (Exception e)
                {
                    MessageBox.Show("Erreur de connexion : " + e.Message);
                    return 0;
                }
            }
    Maintenant que ceci fonctionne, je vais essayer d'adapter une sécurité en plus en utilisant le hashage.

    Si vous avez d'autres suggestions, je suis preneur.
    Et si vous voyez des commentaires à faire sur le code que j'ai fait ici pour mon authentification, n'hésitez pas.

    Merci de votre patience et de votre aide.

    Zebeber

  7. #7
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Pas la peine de compter le nombre de lignes, ton datareader retourne soit 0 ou 1 enregistrement. un petit if (dr.Read()) ou dr.HasRows suffit.
    A+
    Mehdi Feki : Modérateur .Net

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Merci de l'info. Si je peux gagner quelques millisecondes, je prends..

    Si je peux me permettre, j'ai encore une autre question.
    Au chargement de mon programme, j'ouvre une fenêtre qui demande un login et mot de passe. Si ceux ci sont corrects, alors, l'utilisateur peut continuer à utiliser le programme. Si pas, celui ci se ferme (ou redemande le mot de passe).
    La suite de mon programme est une fenêtre parent MDI dans laquelle j'ai un menu et une satusbar.
    Comment puis-je faire pour mettre le nom de l'utilisateur qui se connecte au programme dans un label de ma statusbar?
    Autrement dit, comment passer des paramètres à n'importe quelle fenêtre en c#?

  9. #9
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    La question a été évoquée plusieurs fois, fais une petite recherche tu trouveras la reponse :

    Soit :
    1) Tu cree une classe statique comme ca tu peux acceder aux données dans toutes les forms.
    2) Tu passe le parametre dans le constructeur de la deuxieme form.
    3) tu crees une propriete dans la deuxieme form que tu lui affecte le contenu du username apres la construction de la form.

    y'en plein d'autres.
    Mehdi Feki : Modérateur .Net

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 86
    Points : 41
    Points
    41
    Par défaut
    Merci de ces informations. J'en prends bonne note car ça pourrait résoudre 2-3 de mes soucis dans mon soft.

    Merci encore de ton aide.

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

Discussions similaires

  1. Mettre un mot de passe sur un partage réseau
    Par maxonman dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 06/10/2005, 10h22
  2. Mot de passe sur disque USB
    Par MJEFF dans le forum Windows XP
    Réponses: 7
    Dernier message: 30/09/2005, 15h39
  3. Mot de Passe sur un bouton de com. pour ouvrir un formulaire
    Par Droopynnette dans le forum Access
    Réponses: 1
    Dernier message: 29/09/2005, 11h38
  4. Pb de mot de passe sur un alias interbase
    Par dolzy dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/09/2005, 22h53
  5. Mot de passe sur une carte à puce!?
    Par Le_Che dans le forum C++Builder
    Réponses: 13
    Dernier message: 20/05/2005, 10h37

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