Test sur une Hashtable

Résolu
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011 - 24 mars 2011 à 15:02
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

14 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
24 mars 2011 à 15:52
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) { .. }


;)
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
24 mars 2011 à 15:14
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
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 15:35
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
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
24 mars 2011 à 15:42
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é.

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 16:19
[img]C:\Users\Guizguiz\Desktop\Sans titre.jpg/img

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

Guiguizeitzt
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 mars 2011 à 01:14
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
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
25 mars 2011 à 09:05
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 ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 mars 2011 à 09:16
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
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
25 mars 2011 à 09:20
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 ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 mars 2011 à 09:28
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
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
25 mars 2011 à 09:32
J'ai pas appris le C pour un compilo en particulier, d'où le conseil de mes prof de l'époque, je suppose.
Rejoignez-nous