Page de login en c# [Résolu]

roussel20 15 Messages postés mercredi 4 février 2009Date d'inscription 23 mai 2012 Dernière intervention - 20 févr. 2012 à 17:44 - Dernière réponse : cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention
- 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();
Afficher la suite 

8 réponses

Répondre au sujet
BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 21 févr. 2012 à 10:17
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BasicInstinct
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 21 févr. 2012 à 10:45
+3
Utile
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, ...).
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 22 févr. 2012 à 12:17
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
roussel20 15 Messages postés mercredi 4 février 2009Date d'inscription 23 mai 2012 Dernière intervention - 21 févr. 2012 à 18:25
0
Utile
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();
Commenter la réponse de roussel20
roussel20 15 Messages postés mercredi 4 février 2009Date d'inscription 23 mai 2012 Dernière intervention - 22 févr. 2012 à 15:00
0
Utile
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 ?
Commenter la réponse de roussel20
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 22 févr. 2012 à 15:48
0
Utile
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
Commenter la réponse de cs_jopop
roussel20 15 Messages postés mercredi 4 février 2009Date d'inscription 23 mai 2012 Dernière intervention - 22 févr. 2012 à 15:50
0
Utile
Merci je vais essayer ça et je tiens
Informé
Commenter la réponse de roussel20
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 22 févr. 2012 à 15:50
0
Utile
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).
Commenter la réponse de cs_jopop

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.