Laden...

Benutzeranmeldung erstellen

Erstellt von Vril vor 15 Jahren Letzter Beitrag vor 15 Jahren 13.678 Views
V
Vril Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren
Benutzeranmeldung erstellen

Hallo,
wie kann ich am besten eine Benutzeranmeldung erstellen? Ich habe eine "Hauptform" und bevor diese gestartet wird muß sich ein Benutzer authorisieren. Die Authorisation selbst sollte nicht das Problem sein, hier reicht es wenn Benutzername == Password ist (zwei TextFields), dann wird die Anwendung gestartet. Hat der Benutzer jedoch 10x falsche eingaben gemacht wird die Anmeldung abgebrochen, also Application.Exit();

Kann mir jemand weiterhelfen?

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Am einfachsten ist, in MainForm_Load das AnmeldeForm modal anzuzeigen (.ShowDialog). Bei modaler Anzeige wird gewartet, bis das Form geschlossen ist, und solange folglich auch das MainForm nicht angezeigt.
Und: Direkt hinter AnmeldeForm.ShowDialog() kannste die User-Eingabe auswerten, und entscheiden, was geschehen soll.
Wennde etwa 10 Versuche zulassen willst, den ganzen Vorgang in eine Zählschleife packen.
Inne Sample-Solution von Vorüberlegung zur Form2Form-Kommunikation gibts so ein AnmeldeForm.

Der frühe Apfel fängt den Wurm.

V
Vril Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

Ok, das klingt ja schon mal ganz gut, ich habe jetzt folgendes gemacht:
MainForm = Form1:


 private void Form1_Load(object sender, EventArgs e)
        {
            Benutzeranmeldung bnAnmeldung = new Benutzeranmeldung();
            bnAnmeldung.ShowDialog();
        }

Und in meiner Benutzeranmeldung dann:


  private void button1_Click(object sender, EventArgs e)
        {
            string name = "";
            string password = "xxx";
            name = textBox2.Text;
            password = textBox1.Text;
                        
            if (name != password)
            {
                counter++;
                if (counter == 5)
                {                  
                    Application.Exit();
                }
if (name == password)
            {
                Dispose();
            }
            }
         }

Nur funktioniert das ganze nicht so wirklich. Wenn keine Übereinstimmung vorhanden ist dann verschwindet die Anmeldung trotzdem und die Anwendung wird angezeigt.
Desweiteren kann ich die Anmeldung austricksen in dem ich auf das "X" (Schliessen) clicke.
Was mache ich noch falsch?

265 Beiträge seit 2006
vor 15 Jahren

Ok, das klingt ja schon mal ganz gut, ich habe jetzt folgendes gemacht:
Desweiteren kann ich die Anmeldung austricksen in dem ich auf das "X" (Schliessen) clicke.

ungetestet:


protected override void OnClosing(CancelEventArgs e)
        {
           e.Cancel=true;
        }

EDIT: Code-Tags, Tippfehler im Code

-=MasterMax=-

R
234 Beiträge seit 2007
vor 15 Jahren

Das hat nicht wirklich was mit deinem Problem zu tun, aber was willst du mit folgendem Code bezwecken?

  
string name = "";  
string password = "xxx";  
name = textBox2.Text;  
password = textBox1.Text;  
  

Ich denke diese Lösung ist sinnvoller:


string name = textBox2.Text;
string password = textBox1.Text;

Und nur zu überprüfen ob Benutzername gleich Passwort ist halte ich auch nicht für sicher. 😉

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Vril,

das Thema wurde öfter besprochen. Bitte benutze die Forumssuche und poste die besten Treffer hier. Vielen Dank!

herbivore

84 Beiträge seit 2008
vor 15 Jahren

herbivore hat recht: Wer suchet der findet.

Nichts desto trotz lass ich's mir nicht nehmen die "Mysterien" deines Code's zu korregieren und (in meinen Augen) sauber ablaufen zu lassen:

Start-Formular => Form1

Anmelde-Formular => Form2
Button1 => OK-Button
Button2 => Abbrechen-Button

Also im Form1 einfach die OnLoad Methode überschreiben und das Anmelde-Formular öffnen, anschließend einfach das ShowDialog-Ergebnis überprüfen:


protected override void OnLoad(EventArgs e) {
	Form2 anmeldeForm = new Form2();
	if (anmeldeForm.ShowDialog(this) == DialogResult.OK) {
		// Was auch immer du nach dem Anmelden machen möchtest.
	} else {
		Application.Exit();
	}
	anmeldeForm.Dispose();

	base.OnLoad(e);
}

Im Desinger von Form2 zwei Buttons einfügen, denen einfach "OK" und "Abbrechen" als Text verpassen.
Form2 hat die beiden Eigenschaften "AcceptButton" und "CancelButton", dort wählst du jeweils den dafür vorgesehenen Button aus.
Der Abbrech-Button bekommt durch diese Zuweisung automatisch in die Eigenschaft "DialogResult=Cancel" zugewiesen.
Für den OK-Button wählst du einfach im Designer für den "DialogResult" den Wert "OK" aus.
Durch diese Eigenschaften wird das Formular automatisch durch einen Klick auf die Buttons geschlossen.
Außerdem kann nun auch auf das [X] geklickt werden, da wird auch nur "Cancel" als DialogResult zurückgegeben.

Nun musst du einfach beim Schließen des Anmelde-Formular's überprüfen ob die Werte korrekt sind und ggf. den Schließvorgang abbrechen:



protected override void OnFormClosing(FormClosingEventArgs e) {
	if (this.DialogResult == DialogResult.OK) {
		string name = this.textBox1.Text;
		string pwd = this.textBox2.Text;

		if (name != password) {
			e.Cancel = true;
			MessageBox.Show(this, "Autsch, das war jetzt nicht korrekt!", "Hast was falsch gemacht!", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
	}

	base.OnFormClosing(e);
}


Einen Counter halte ich für unangebracht. Da das ganze ja eh wieder vom neuem beginnt wenn die Anwendung neugestartet wird.
Wenn dann muss sowas extra ausgelagert werden glaube ich, also zum Beispiel in ne Datenbank oder ne "geheime" Datei.

Ja... das wäre meine Variante!
Viel Spaß

Gruß Matscher

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo,

natürlich hat herbivore recht, aber ich sehe das Problem der passenden Suchbegriffe. Ich habe über benutzer+anmeldung+anwendung vor allem Rainbirds Vorschlag Rechtesystem mit Windows-Authentifizierung gefunden.

Deshalb möchte ich meinen Vorschlag bringen: Eine eigene Anmeldeprozedur sollte nicht in MainForm_Load gesetzt werden (denn das stört alles, was mit Load und Application.Run und Appl.Exit zusammenhängt), sondern in Program.cs in die Main-Methode vor Application.Run(MainForm). In dieser Weise kann Matschers Vorschlag eingebaut werden:

bool OK = false;
using( LoginForm login = new LoginForm() ) {
   OK = (login.ShowDialog() == DialogResult.OK);
}
if (OK) {
   Application.Run(new MainForm());
}

Achtung: Matschers Vorschlag ist zu ändern. Benutzt werden sollte vor allem das FormClosing-Ereignis. Korrekt ist aber die Prüfung von Benutzername/Passwort und das Setzen von DialogResult.

Der Zähler wäre Bestandteil von LoginForm und würde ebenfalls in FormClosing ausgewertet.

Gruß Jürgen

5.299 Beiträge seit 2008
vor 15 Jahren

@Vril: Dein Code geht nicht gut, weil du die Eingaben im Anmeldeformular versuchst auszuwerten, und dort schon reagieren willst.
Das Reagieren ist aber Sache des Main-Forms (oder der Sub Main - jedenfalls des Aufrufers) - ich mein, ich hab doch 'ne lauffähige Vorlage angegeben?
Matscher hat den Fehler tendenziell auch.
Son AnmeldeDialog sollte auchn OK-Button haben, der DialogResult.OK returnt. Wenn mit dem geschlossen wird, wird die Eingabe überhaupt ausgewertet. Alle anderen Schließmethoden sollten DialogResult.Cancel returnen.
Wie mein Sample zeigt: Man kann die Ablaufstruktur ganz einfach halten - Es ist nicht mal nötig, auch nur ein Event zu abonnieren.

Der frühe Apfel fängt den Wurm.

V
Vril Themenstarter:in
86 Beiträge seit 2008
vor 15 Jahren

Vielen Dank für die Tipps!!!
Ich hab jetzt den Vorschlag von 'ErfinderDesRades' zum Laufen gebracht!! Ich gebe zu das Beispiel war mir anfangs einfach etwas zu gut, sprich ich hab es nicht so recht verstanden.
Funktioniert aber super, auch das Problem mit dem "X" ist gelöst und einen Counter konnte ich dann auch recht einfach integrieren!