Autor Beitrag
Neonium
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 29.08.08 08:15 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Login l = new Login();
//... die Login einstellungen
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)
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Fr 29.08.08 09:40 
Du musst die Login Form einfach schließen =)
Skiller-1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 100

Win XP | Debian | Ubuntu
C# | PHP | VB.NET
BeitragVerfasst: Fr 29.08.08 10:18 
Und um die SQL-Injection zu verhindern solltest du Parametrisierte SQL-Abfragen verwenden.
Infos hierszu gibts es unter: www.galileocomputing...e95ecd103ddabd86eec1

_________________
~ Wer Rechtschreibfehler findet darf sie behalten ~
Neonium Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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.


Zuletzt bearbeitet von Neonium am Fr 29.08.08 12:43, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 29.08.08 12:42 
user profile iconNeonium 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:
ausblenden 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().)

user profile iconNeonium 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 29.08.08 13:57 
user profile iconNeonium 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 01.09.08 09:12 
Der Code ist eigentlich der von oben, aber ich poste ihn hier nochmal

ausblenden volle Höhe 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

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            // btn_login
            this.btn_login.Location = new System.Drawing.Point(9977);
            this.btn_login.Name = "btn_login";
            this.btn_login.Size = new System.Drawing.Size(7523);
            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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Mo 01.09.08 09:20 
unter
ausblenden 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

ausblenden C#-Quelltext
1:
2:
3:
Login l = new Login();
//... die Login einstellungen 
while( l.ShowDialog() != DialogResult.OK );
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 01.09.08 10:51 
user profile iconGreenberet 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 01.09.08 12:19 
Dann nimm eben nur den ersten Teil von Greenberets Post mit dem Close.

_________________
>λ=
Neonium Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 01.09.08 13:43 
Verstehe nich ganz was machen soll irgendwie funktioniert das nicht so ganz, wie ich mir das vorstelle.