Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 47
    Points : 4
    Points
    4

    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 Expert
    Avatar de Mehdi Feki
    Inscrit en
    décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 113
    Points : 1 433
    Points
    1 433

    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
    Nouveau Membre du Club
    Inscrit en
    septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : septembre 2006
    Messages : 79
    Points : 25
    Points
    25

    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
    Invité de passage
    Inscrit en
    mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 47
    Points : 4
    Points
    4

    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 :
    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 Expert
    Avatar de Mehdi Feki
    Inscrit en
    décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 113
    Points : 1 433
    Points
    1 433

    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 :
    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 :
    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
    Invité de passage
    Inscrit en
    mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 47
    Points : 4
    Points
    4

    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 :
    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 Expert
    Avatar de Mehdi Feki
    Inscrit en
    décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 113
    Points : 1 433
    Points
    1 433

    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
    Invité de passage
    Inscrit en
    mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 47
    Points : 4
    Points
    4

    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 Expert
    Avatar de Mehdi Feki
    Inscrit en
    décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 113
    Points : 1 433
    Points
    1 433

    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
    Invité de passage
    Inscrit en
    mars 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 47
    Points : 4
    Points
    4

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •