Test sur une Hashtable [Résolu]

Signaler
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
-
cs_jopop
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
Bonjour je souhaite protéger une appli en c# par un mot de passe donc j'ai fait une fenêtre pour l'authentification, et je souhaite stocker les mots de passe et nom d'utilisateur dans une Hashtable. J'ai créer deux clés et deux valeurs :
tablemdp.Add("admin", "password");
            tablemdp.Add("utilisateur", "mdp");

Le souci c'est que je peu tester si le nom existe et le mot de passe en fonction de ce que je rentre dans les textbox mais si je met par exemple admin et comme mot de passe : mdp , le test deviens vrai alors que je veux que ce soit juste admin - password et utilisateur - mdp.
 if (tablemdp.ContainsKey(tbid.Text) && tablemdp.ContainsValue(tbmdp.Text))
            {
                // accès à l'autre fenêtre
                this.Close();
            }
            else
            {
                MessageBox.Show("Mot de passe incorect");
            }



si quelqu'un peu m'aider
d'avance merci.

Guiguizeitzt

14 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Testé, ça fonctionne chez moi.

Ton erreur vient peut-être du fait que t'as traduit le pseudo code de la 2ème conditionnelle comac :
if (tablemdp[tbid.Text] == tbmdp.Text) { .. }

alors qu'il faut l'écrire comac :
if (tablemdp[tbid.Text].ToString() == tbmdp.Text) { .. }


;)
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Salut,

faut simplement tester en 2x, algo :

// username et password sont les info saisies par l'utilisateur
if (mahash.contient(username)) {
if (mahash[username] == password) {
// tout est bon, on passe à l'action
} else {
Message("t'as ripé sur le MDP");
}
} else {
Message("t'existe même pas");
}

pour des raisons de sécurité il vaut mieux mettre le même message d'erreur pour les 2 cas (un utilisateur malhonnête pourrait valider un login sinon), mais là c'est pour que tu comprennes bien le découpage ;)

PS : pour plus de détail, voir la MSDN
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011

Merci pour ta reponse je vois que tu es toujours aussi efficace sur mes post ;-)
mais cette solution m'a deja effleurer l'esprit mais j'obtient toujours que le mot de passe est pas bon si mon nom est bon ( un peu cafouilli ma phrase ^^)


Guiguizeitzt
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
En saisissant admin/password (ou utilisateur/mdp) ça valide pas ?
Avec le pseudo code que j'ai filé ?
Je vais tester de mon côté.
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011

[img]C:\Users\Guizguiz\Desktop\Sans titre.jpg/img

Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011

erreur : La référence d'objet n'est pas définie à une instance d'un objet.
sur la ligne :
if (tablemdp[tbid].ToString() == tbmdp.Text)
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Erreur de frappe ? c'est tbid.Text qu'il faut que tu mettes en index, pas tbid tout court
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011

Ah oui pardon
merci ca marche nikel !!! =)

Guiguizeitzt
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
A noter que l'on peut aisement le faire en un test :

if (tablemdp.ContainsKey(tbid.Text) && tablemdp[tbid.Text].Equals(tbmdp.Text)) { 
   ... 
}


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Re,

@Renfield : si la clé tbid.Text n'existe pas dans tablemdp, il me semble que tablemdp[tbid.Text] va lever une exception (à confirmer), nop ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Non.

En fait, vu que l'expression utilise un &&, il faut, bien évidemment que les deux parties de l'expression soit vérifiées.

s'évitant des tests pour rien, la seconde partie ne sera pas évaluée dès lors que la première aura échoué.

aucun soucis, donc.

gaffe cependant à mettre les tests dans le bon ordre ^^

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Parce que les tests sont ordonnés ?
Quand je faisais du C on apprenait qu'il fallait surtout pas imaginer l'ordre d'interprétation d'une conditionnelle multiple. ça a dû changer avec le C# je suppose, bon à savoir ;)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
idem en C, mais cela dépend du compilateur, chacun est plus ou moins libre, cette manière de procéder doit bien être édictée dans tel ou tel document de standardisation.

ce n'est pas le cas pour du VB6, par exemple.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
J'ai pas appris le C pour un compilo en particulier, d'où le conseil de mes prof de l'époque, je suppose.