Page de login en c# [Résolu]

Signaler
Messages postés
15
Date d'inscription
mercredi 4 février 2009
Statut
Membre
Dernière intervention
23 mai 2012
-
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
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

Messages postés
1471
Date d'inscription
mardi 5 février 2002
Statut
Membre
Dernière intervention
20 octobre 2014
10
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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, ...).
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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)
Messages postés
15
Date d'inscription
mercredi 4 février 2009
Statut
Membre
Dernière intervention
23 mai 2012

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();
Messages postés
15
Date d'inscription
mercredi 4 février 2009
Statut
Membre
Dernière intervention
23 mai 2012

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 ?
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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
Messages postés
15
Date d'inscription
mercredi 4 février 2009
Statut
Membre
Dernière intervention
23 mai 2012

Merci je vais essayer ça et je tiens
Informé
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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).