Entwickler-Ecke
WinForms - Problem mit Login Form
Neonium - Fr 29.08.08 08:15
Titel: Problem mit Login Form
Hallo,
ich hab ein Login Form und ein Main Form. Habe zum einen das Problem das in meinem Login Form der Login Button nich als Default/Accept Button benutzen kann. Zum anderen Habe ich das Problem das nich weiss wie ich es am besten mache das ich zuerst das Login Form habe. Dann wenn die Anmeldung erfolgreich war das Main Form öffnen und das Login Form schließen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| private void btn_login_Click(object sender, EventArgs e) { if (txt_LoginBenutzername.Text == "" || txt_LoginPassword.Text == "") { MessageBox.Show("Bitte geben Sie ein Benutzernamen und Passwort ein!", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { String pw = cBCrypt.HashPassword(txt_LoginPassword.Text, Properties.Settings.Default.Hashstring); String auth = "SELECT * FROM [User] WHERE [Username] = '" + txt_LoginBenutzername.Text + "' AND [Password] = '" + pw + "'"; SqlConnection conn = new SqlConnection(Properties.Settings.Default.BudgetConnectionString); SqlCommand com = new SqlCommand(auth, conn); SqlDataReader reader = null;
try { conn.Open(); reader = com.ExecuteReader(); if (reader.HasRows) { Application.Run(new Form1()); } else { MessageBox.Show("Benutzername oder Passwort falsch!", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } } finally { reader.Close(); conn.Close(); } } } |
Über die Main Methode habe ich mit Application.Run(new Login()) gestartet. Habe noch keine Lösung gefunden die Funktioniert.
MFG Neo
Greenberet - Fr 29.08.08 08:36
Application.Run vergiss einmal, das kommt im normalfall nur 1 mal im Programm vor
in deiner Main Methode mach folgendes
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Login l = new Login(); do { l.ShowDialog(); } while( !l.AuthOk ); Application.Run(new Form1()); |
Du musst halt noch ein AuthOk Property erstellen wo du einstellst ob die Authentifizierung ok war.
mir ist noch was in deinem code aufgefallen.
schau dir mal den connection string an wenn du als Benutzername folgendes eingibst.(mit den Hochkomma)
Quelltext
1:
| a' OR 1 = 1 OR [Username] = 'a |
Falls ich mich jetzt nicht verschrieben habe, dann sollte man sich einloggen können obwohl der Name eig. falsch ist. Wenn du willst kannst du bei dem Versuch auch ein beliebiges falsches Passwort eingeben. Es wird trotzdem gehen solang user in der Datenbank vorhanden sind.
Es lebe die SQL Injection
Neonium - Fr 29.08.08 09:15
Danke für die schnelle Antwort. Ich habe mir jetzt im Login Form eine public Boolean Authok angelegt die setzte ich auf false, wenn ich in Zeile 21 meines oben geposteten Codes komme. Wie kriegt jetzt meine Schleife im Programm mit das die Variable auf false ist? Wie kann ich das mit dem SQL String verbessern.
Greenberet - Fr 29.08.08 09:40
Du musst die Login Form einfach schließen =)
Neonium - Fr 29.08.08 12:31
Ok jetzt hab ich ein anderes Problem :D Wenn ich das Login Fenster schließe dann komm ich ja automatisch ins Programm, wenn ich jetzt authok standardmäßig auf true setzte komm ich nicht aus der schleife raus. :( Das mit dem Acceptbutton hab ich leider auch noch nicht raus bekommen.
JüTho - Fr 29.08.08 12:42
Neonium hat folgendes geschrieben: |
| Ok jetzt hab ich ein anderes Problem :D Wenn ich das Login Fenster schließe dann komm ich ja automatisch ins Programm, wenn ich jetzt authok standardmäßig auf true setzte komm ich nicht aus der schleife raus. |
Der Vorschlag mit der Schleife war offensichtlich nicht optimal. Mein Vorschlag lautet:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| bool OK = false; using(LoginForm frm = new LoginForm()) { OK = frm.ShowDialog() == DialogResult.OK; } if (OK) Application.Run(new MainForm()); |
Dazu muss natürlich DialogResult.OK gesetzt werden; das erspart die zusätzliche Eigenschaft AuthOK. (Der using-Block umfasst automatisch das frm.Close().)
Neonium hat folgendes geschrieben: |
| :( Das mit dem Acceptbutton hab ich leider auch noch nicht raus bekommen. |
In der Klasse LoginForm muss this.AcceptButton auf LoginButton (oder wie auch immer er heißt) gesetzt werden. Das geht natürlich am einfachsten im Eigenschaften-Editor des Formulars. Oder was ist Dein Problem?
Gruß Jürgen
PS. Entferne bitte die nachträglich hinzugefügte Zusatzfrage: Anderes Problem => neue Diskussion eröffnen.
Neonium - Fr 29.08.08 13:36
Das mit dem Acceptbutton hab ich hinbekommen da hab ich das this. vor vergessen. Wie setz ich den DialogResult.ok muss jetzt die Funktion des Buttons zu einer DialogResult Funktion machen. Dann return DialogResult.OK, dabei krieg ich immer die Fehlermeldung das nicht alle Codeteile was zurückgeben
JüTho - Fr 29.08.08 13:57
Neonium hat folgendes geschrieben: |
| ... Wie setz ich den DialogResult.ok muss jetzt die Funktion des Buttons zu einer DialogResult Funktion machen. Dann return DialogResult.OK, dabei krieg ich immer die Fehlermeldung das nicht alle Codeteile was zurückgeben |
Du benutzt doch LoginButton-Click, oder? Was lässt Du dort prüfen und erledigen? Bitte gib Deinen Code an, damit wir die Fehlermeldung erklären können und Verbesserungsvorschläge machen können.
Außerdem gibt es die
SDK-Doku/MSDN mit vielen Beispielen. Im Login-Formular kann die Eigenschaft
DialogResult gesetzt werden; das hat dann nichts mit return (wo auch immer; auch dazu fehlt Code) zu tun.
Jürgen
Neonium - Mo 01.09.08 09:12
Der Code ist eigentlich der von oben, aber ich poste ihn hier nochmal
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| private void btn_login_Click(object sender, EventArgs e) { if (txt_LoginBenutzername.Text == "" || txt_LoginPassword.Text == "") { MessageBox.Show("Bitte geben Sie ein Benutzernamen und Passwort ein!", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { String pw = cBCrypt.HashPassword(txt_LoginPassword.Text, Properties.Settings.Default.Hashstring); String auth = "SELECT * FROM [User] WHERE [Username] = " + "@Benutzername AND [Password] = @passwort";
SqlConnection conn = new SqlConnection(Properties.Settings.Default.BudgetConnectionString); SqlCommand com = new SqlCommand(auth, conn); com.Parameters.AddWithValue("@Benutzername", txt_LoginBenutzername.Text ); com.Parameters.AddWithValue("@passwort", pw); SqlDataReader reader = null;
try { conn.Open(); reader = com.ExecuteReader(); if (reader.HasRows) { btn_login.DialogResult = DialogResult.OK; } else { MessageBox.Show("Benutzername oder Passwort falsch!", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); } } finally { reader.Close(); conn.Close(); } } } |
Hier wird der Button im Designer
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| this.btn_login.Location = new System.Drawing.Point(99, 77); this.btn_login.Name = "btn_login"; this.btn_login.Size = new System.Drawing.Size(75, 23); this.btn_login.TabIndex = 2; this.btn_login.Text = "Login"; this.btn_login.UseVisualStyleBackColor = true; this.AcceptButton = btn_login; |
Jetzt hab ich das Problem das nix passiert wenn ich auf den Button klicke.
Greenberet - Mo 01.09.08 09:20
unter
Quelltext
1:
| btn_login.DialogResult = DialogResult.OK; |
mach noch ein this.Close(); hinein
@JüTho
das using is komplett unsinnig. Das ruft ein Close() nur bei Streams soweit ich weiß.
Abgesehen davon geht er in der Methode eh nicht weiter weil er durch das ShowDialog sowieso aufs Close wartet ;)
Der Vorschlag mit der Schleife passt schon. Nur da er ja jetzt mit DialogResult arbeitet
C#-Quelltext
1: 2: 3:
| Login l = new Login(); while( l.ShowDialog() != DialogResult.OK ); |
Kha - Mo 01.09.08 10:51
Greenberet hat folgendes geschrieben: |
@JüTho
das using is komplett unsinnig. |
Die Erklärung war zwar falsch,
using ist trotzdem goldrichtig.
Form implementiert zwar IDisposable, bei einem Aufruf mit Show kümmert sich die Klasse aber selbst darum. Bei ShowDialog kann sie sich beim Schließen allerdings nicht selbst disposen, da man danach ja noch ihre Eigenschaften auswerten will. Also muss sich der User darum kümmern.
Neonium - Mo 01.09.08 12:11
Also bei mir funktioniert beides nich wirklich.
Der Vorschlag von Greenberet, weil da fehlt ja wieder das Abbrechen (das Windows X). Wenn ich das mit using versuche dann reagiert der Button gar nicht. Wenn einer das Windows Schließen klickt soll er gar nix machen bzw. das Programm beenden.
Kha - Mo 01.09.08 12:19
Dann nimm eben nur den ersten Teil von Greenberets Post mit dem Close.
Neonium - Mo 01.09.08 13:43
Verstehe nich ganz was machen soll irgendwie funktioniert das nicht so ganz, wie ich mir das vorstelle.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!