Autor Beitrag
Romy
Hält's aus hier
Beiträge: 8

Win XP
VB, Java, C#
BeitragVerfasst: Mi 04.02.09 17:12 
Hallo!

Ich hab ein kleines Problem bei meiner Benutzeranmeldung.
Ich möchte den Benutzernamen, die E-Mail-Adresse sowie das Passwort abfragen und mit meiner ACCESS-Datenbank vergleichen.
Das 1. Problem: Benutzername und E-Mail-Adresse stehen in einer Tabelle (tblBenutzer) und das Passwort steht in einer anderen Tabelle (tblPasswort) - ich möchte das Passwort nämlich verschlüsselt übergeben (noch in Planung).
Die beiden Tabellen sind über die laufende Nummer/Benutzernamen miteinander verknüpft.
Mein 2. Problem: Ich weiß nicht recht wie ich jetzt das Passwort abfragen soll bzw. wie ich überhaupt die Abfrage gestalten soll (es sollen alle 3 Parameter verglichen werden).

Ich hab es auf diese Variante versucht, nur es kann eigentlich so nicht funktionieren...und es funktioniert auch nicht...
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:
private void cmdAAnmelden_Click(object sender, EventArgs e)
        {
            try
            {   //Abfrage ob alle Felder ordnungsgemäß ausgefüllt wurden
                if (txtBN.Text == "" || txtMail.Text == "" || txtPW.Text == "")
                {
                    throw new Exception("Sie haben nicht alle Felder richtig ausgefüllt!");
                }

                db.dbOpen();
                strQuelle = "D:\\SCHULE HAK\\Maturaprojekt\\CH_Chemialiendatenbank1.0\\CH_Chemialiendatenbank1.0\\bin\\Debug\\Benutzer.mdb";

                cn = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Password=;data source=" + strQuelle;
                sql = "Select Benutzername, [E-Mail], Passwort FROM tblBenutzer WHERE Benutzername=" + txtBN.Text;
                //MessageBox.Show(sql);

                if (Benutzername != txtBN.Text || Passwort != txtPW.Text || E-Mail != txtMail.Text)
                {
                    counter++;
                    if (counter == 5//5 Versuche um sich anzumelden
                    {
                        Application.Exit();
                        MessageBox.Show("Sie sind am System angemeldet!""EINGELOGGT");
                    }
                    if (benutzername == benutzerpwd)
                    {
                        Dispose();
                        MessageBox.Show("Fehler! Sie sind nicht angemeldet!""FEHLER");
                    }
                }
        }
         catch (Exception exp)
            {
                MessageBox.Show(exp.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }    
    }


Ich bräuchte eine Tipp bzw. ein Bsp um zu verstehen, nach welchen Kriterien ich das Ganze aufbauen muss um zu einem vernünftigen Ergebnis zu kommen.

Vielen lieben Dank für eure Hilfe!
Lg Romy
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: Mi 04.02.09 17:41 
Hallo Romy,

vom Konzept her solltest Du so vorgehen: Wenn der Benutzername eingegeben wurde, werden die Angaben zu dieser Benutzerin eingelesen. Der Zugang wird erlaubt, wenn zu diesen Datensätzen auch Email-Adresse und Passwort übereinstimmen.

Das Passwort darf keinesfalls selbst gespeichert werden. Stattdessen ist es als HashCode zu verschlüsseln und nur dieser ist zu speichern. Ein eingegebenes Passwort ist zuerst zu verschlüsseln und nur mit dem gespeicherten Code zu vergleichen.

In dieser Situation darf der SELECT-Befehl mit JOIN alle Werte in einem Schritt zurückliefern, weil aus diesem Einlesen keine Änderungen zurückgespeichert werden sollen.

Dir fehlt anscheinend noch der Grundsatz, wie eine DbConnection erstellt und eine Abfrage ausgeführt werden soll. So etwa muss es aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
bool result = false;
string connstr = "...";
string cmdstr = "SELECT ...";
using(DbConnection conn = new DbConnection(connstr)) {
   //  es gibt noch andere Möglichkeiten
   DbCommand cmd = new DbCommand(cmdstr, conn);
   cmd.Parameters.AddWithValue("@name", inputUsername.Text);
   try {
      conn.Open();
      DbDataReader reader = cmd.ExecuteReader();
      if(reader.Read()) {
         //  mit Email und Passwort vergleichen
         result = reader.GetString(1).Equals(inputEmail.Text)
            && reader.GetString(2).Equals(inputPassword.Text);
      }
   } catch(Exception ex) {
      MessageBox.Show(ex.ToString());
   }
}

Eine ausführliche Einführung gibt es in OpenBook VC# Kap.25 ff. Du musst für Access statt der Db- oder Sql-Klassen die OleDb-Klassen verwenden und Parameter mit '?' im SELECT-String angeben. Siehe außerdem [Artikel] Datenbanken richtig öffnen und schließen sowie [Artikelserie] Parameter von SQL Befehlen; beachte dazu: Benutze für variable Inhalte eines SQL-Befehls niemals String-Verknüpfung, sondern immer DbParameter!

Der Zähler mit max. 5 Versuchen gehört nicht in diesen Arbeitsablauf, sondern getrennt davon. Zwischendurch muss der Anwender schließlich neue Eingaben machen können.

Gruß Jürgen