Page de login en c#

Résolu
roussel20 Messages postés 14 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 23 mai 2012 - 20 févr. 2012 à 17:44
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 - 22 févr. 2012 à 15:50
Bonjour, ma question est la suivant j'aimerai créer une page de login qui vérifie les information saisie dans le textbox dans une base de donnée sql serveur et ensuite redirige l'utilisateur vers une page en fonction de son nom d'utilisateur.
mais j'y arrive pas si quelqu'un aurai une solution.
merci d'avance
            connection = new SqlConnection("Data Source=mabase;Initial Catalog=BDD;User ID=sa;Password=password");
            query = (" SELECT Nom, Password FROM [marine_utilisateur] WHERE Nom='"+TextBoxNom.Text+"'AND Password= '"+TextBoxPassword.Text+ "'");
            command = new SqlCommand(query, connection);
            connection.Open();
            reader = command.ExecuteReader();
            string pass, user;
            user = TextBoxNom.Text;
            pass = TextBoxPassword.Text;
            while (reader.Read())
            {
                if (reader["Nom"].ToString() != TextBoxNom.Text && reader["Password"].ToString() != TextBoxPassword.Text)
                {
                    Label1.Text = "Nom utilisateur ou mot de passe invalide";
                }
                

                else
                {
                    if (reader["Nom"].ToString() == "admin" && reader["Password"].ToString() == "BTSbts2")

                        Response.Redirect("~/PageAdmin.aspx");
                    else
                    {
                        if (reader["Nom"].ToString() == TextBoxNom.Text && reader["Password"].ToString() == TextBoxPassword.Text)
                        {
                            Response.Redirect("~/Default.aspx");
                        }

                    }
                }
                     
                                        

                     
            }
            

            

            connection.Close();

8 réponses

BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
21 févr. 2012 à 10:17
salut,

Pour des raisons évidentes de sécurité
1 tu ne dois pas te connecter a ta base avec le login "sa".
2 le mot de passe {' or '1'='1} sans les accolades te renverra le 1er utilisateur quelque soit le nom...par expérience souvent l'admin


c'est écrit a la volée, mais ça devrait fonctionner

//test l'existence du couple l'utilisateur/mdp:
if (!reader.HasRows)
Label1.Text = "Nom utilisateur ou mot de passe invalide";
else
{
// test de l'utilisateur
  reader.read();
  if (reader["Nom"].ToString() == "admin")
     Response.Redirect("~/PageAdmin.aspx");
  else
     Response.Redirect("~/Default.aspx");
}



BasicInstinct
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
21 févr. 2012 à 10:45
Salut,

petit complément d'info. Utilise les Commande.Parameters pour éviter le risque d'injection sql (cf. point 2 de BasicInstinct).

Ensuite ta requête ne doit renvoyer qu'un tuple (ou aucun), sinon y'a un souci d'archi. Utilise plutôt if (reader.Read()), comac au pire t'as que le premier.

Enfin, n'hésite pas à utiliser un using qui se chargera de fermer ton DataReader correctement quelque soit le résultat (error, no data, ...).
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 févr. 2012 à 12:17
De rien,

encore un tit supplément d'info : il convient de crypter les mots de passes enregistrés en base de donnée. Les méthodes les plus courantes sont le MD5 et le SHA1, qui permettent d'encrypter mais pas de décrypter. Tu insère alors tes utilisateurs avec une requête du type :

INSERT INTO users (login, password) VALUES ('admin', MD5('adminPass'));


Et pour vérifier la validité des informations saisies par l'utilisateur :

SELECT * FROM users WHERE login @login AND password MD5(@password);


(@login & @password représentant les info saisies)
3
roussel20 Messages postés 14 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 23 mai 2012
21 févr. 2012 à 18:25
Merci de vos réponse j'ai suivie vos conseils pour palier au problème d'injection SQL j'ai fais des requêtes paramétrées du genre.
la réponse de BasicInstinct du moins le code qu'il a laissé fonctionne et encore merci à tout les deux d'avoir pris du temps de me répondre
SqlConnection connection = new SqlConnection("Data Source=mabase;Initial Catalog=BDD;User ID=sa;Password=password");
string query = " SELECT count(*) FROM [marine_utilisateur] WHERE Nom=@nom AND Password= @password";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.Add("@nom", TextBoxNom.Text);
command.Parameters.Add("@password", TextBoxPassword.Tex);
connection.Open();
int result = (int)command.ExecuteScalar();
if(result > 0)
{
// contriole user/mot de passe OK
}
connection.Close();
0

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

Posez votre question
roussel20 Messages postés 14 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 23 mai 2012
22 févr. 2012 à 15:00
Bonjour jopop je vais penser au cryptage des mots de passe.
J'aurai juste une question comment pourrais je
Faire patienter un utilisateur pendant 60 seconde si il essai de se connecter 3 fois ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 févr. 2012 à 15:48
Re,

j'ai jamais fait ça, donc je vais envoyer mes idées à la volée :
- sur la 3ème Request erronée tu enregistres en session le DateTime correspondant (que j'appelerai dtErr),
- sur la Response tu regardes le DateTime actuelle (dtCur), tu calcules le TimeSpan (différence entre deux DateTime) : tsDelta = (dtCur - dtErr)
* si >= 60s alors tu balances la page normale,
* si < 60 alors tu bloques les contrôles de saisie et tu affiches un décompte javascript d'une durée de (60 - tsDelta) secondes.

bon dev
0
roussel20 Messages postés 14 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 23 mai 2012
22 févr. 2012 à 15:50
Merci je vais essayer ça et je tiens
Informé
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
22 févr. 2012 à 15:50
Ah, et j'ai oublié, pour savoir qu'il s'agit de la 3ème connexion ratée, il faut également enregistrement un compteur en session. Et bien penser à le remettre à 0 lorsque l'utilisateur réussi sa connexion (voire également remettre à 0 lorsqu'il aura attendu les 60 secondes après une première triplette d'échecs).
0
Rejoignez-nous