Test sur une Hashtable [Résolu]

Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
- - Dernière réponse : cs_jopop
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
- 25 mars 2011 à 09:32
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
Afficher la suite 

14 réponses

Meilleure réponse
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
3
Merci
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) { .. }


;)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 198 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_jopop
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
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
Commenter la réponse de cs_jopop
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
0
Merci
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
Commenter la réponse de cs_guiguizeitzt
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
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é.
Commenter la réponse de cs_jopop
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
0
Merci
[img]C:\Users\Guizguiz\Desktop\Sans titre.jpg/img

Commenter la réponse de cs_guiguizeitzt
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
0
Merci
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)
Commenter la réponse de cs_guiguizeitzt
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
Erreur de frappe ? c'est tbid.Text qu'il faut que tu mettes en index, pas tbid tout court
Commenter la réponse de cs_jopop
Messages postés
28
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
24 mars 2011
0
Merci
Ah oui pardon
merci ca marche nikel !!! =)

Guiguizeitzt
Commenter la réponse de cs_guiguizeitzt
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
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
Commenter la réponse de Renfield
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
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 ?
Commenter la réponse de cs_jopop
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
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
Commenter la réponse de Renfield
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
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 ;)
Commenter la réponse de cs_jopop
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
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
Commenter la réponse de Renfield
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
0
Merci
J'ai pas appris le C pour un compilo en particulier, d'où le conseil de mes prof de l'époque, je suppose.
Commenter la réponse de cs_jopop