Fragensteller
ASP.NET WebForms - Benutzer soll nach Login eingeloggt bleiben

Frage
-
Hallo zusammen,
ich bin gerade dabei für mein WebForms-Projekt eine Benutzeranmeldung zu programmieren (bin noch ziemlicher Anfänger in ASP.NET). Das Login klappt schon, die eingegeben Daten werden mit den Daten aus meiner mySQL-Datenbank geprüft und die Anwendung gibt zurück, ob Benutzername und Passwort übereinstimmen.
Jetzt möchte ich aber, dass der Benutzer nach dem Login in der Webanwendung angemeldet bleibt um z.B. auf sein Profil zugreifen zu können.
So sieht bis jetzt meine LogIn-Methode aus. Diese wird ausgeführt, sobald der Button "Einloggen" geklickt wird.
protected void LogIn(object sender, EventArgs e) { string sql = "Select benutzername, passwort" + " From ausbilder" + " Where benutzername = @benutzername"; MySqlCommand sqlAnweisung = new MySqlCommand(sql); sqlAnweisung.Parameters.AddWithValue("@benutzername", UserName.Text); MySqlConnection con = new MySqlConnection(dbcon.ConnectionString); sqlAnweisung.Connection = con; con.Open(); MySqlDataReader dataReader = sqlAnweisung.ExecuteReader(); if (dataReader.Read()) { if (dataReader.GetString("passwort").Equals(Password.Text)) { UserName.Text = "Erfolgreich"; } else { UserName.Text = "nicht Erfolgreich"; } } else { UserName.Text = "nicht Erfolgreich"; } con.Close(); }
Vielen Dank für Eure Unterstützung!
- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 17. Juli 2015 09:03 Richtiges Unterforum (aus: Visual C#)
Alle Antworten
-
Hy,
für sowas eignet sich am besten Session-Variablen.
Auf diese Variaben kann man solange die Sitzung gültig ist zugreifen und beim abmelden auch löschen.
Aber du solltest vorher dir über einpaar Sachen im klaren sein.
DB-Abfrage schreibt man nicht einfach so in ein Event wie bsp beim Click vom Button.
Am besten du lagerst die DB-Abfragen in eine eigene Klasse und gibst ein DataTable oder ähnliches zurück.
Mit der kannst dann weiter arbeiten.
Sehr vereinfachte Klasse.
public DataTable getDataFromDB(string query, SqlConnection con){ DataTable dt = new DataTable(); SqlDataAdapter sqlDT = new SqlDataAdapter(query, con); try { con.Open(); sqlDT.Fill(dt); } ... return dt; }
Noch besser wenn du mit SQL-Parameter arbeitest.
Der neuer Login-Event
protected void LogIn(object sender, EventArgs e) { MySqlConnection con = new MySqlConnection(dbcon.ConnectionString); // DB-Abfrage und gleich als DataTable übergebeen DataTable dtUser = getDataFromDB("Select benutzername, passwort" + " From ausbilder" + " Where benutzername = '" + Username.Text + "' AND passwort= '" + Passwort.Text + "'", con); if (dt != null && dt.Rows.Count > 0) { Session["user"] = dt; } else { throw new Exception("Anmeldung fehlgeschlagen"); } }
Somit hast das User Objekt nach erfolgreicher Anmeldung an eine Session übergeben und kannst damit weiter arbeiten (Bsp. Name anzeigen usw).
Hoffe das ich dir damit weiter helfen konnte.
LgWaZZ
- Bearbeitet WaZZkeSS Mittwoch, 22. Juli 2015 06:33
-
Zusätzlich würde ich noch mit verschlüsselten Passwörtern arbeiten. Passwörter im Klartext in einer Datenbank zu speichern ist meist nicht die gängige Praxis. Daher wäre es besser, wenn du das Passwort in einen z.B. MD5-Hash Wert umwandelst und diesem mit dem in der Datenbank abgleicht (String in MD5-Hash). Dabei speicherst du nur das verschlüsselte Passwort in der Datenbank und beim Abgleich wandelst du ebenso die Eingabe um und gleichst dann ab. Angelehnt an das Beispiel von WaZZkeSS:
protected void LogIn(object sender, EventArgs e) { // Siehe Methode "GetMD5Hash" in dem Link, den ich gepostet habe string hashPassword = GetMD5Hash(Passwort.Text); MySqlConnection con = new MySqlConnection(dbcon.ConnectionString); // DB-Abfrage und gleich als DataTable übergebeen DataTable dtUser = getDataFromDB("Select benutzername, passwort" + " From ausbilder" + " Where benutzername = '" + Username.Text + "' AND passwort= '" + hashPassword + "'", con); if (dt != null && dt.Rows.Count > 0) { Session["user"] = dt; } else { throw new Exception("Anmeldung fehlgeschlagen"); } }
Um den Login zu speichern, könntest du auch Cookies benutzen. Die werden bei Anfragen immer hin und her geschickt und haben den Vorteil, dass du einfacher festlegen kannst wie lange das Cookie gültig sein soll.
Beispiel:
HttpCookie loginCookie = new System.Web.HttpCookie("login", dt.Rows[0]["benutzername"].ToString());
// Cookie gültig wird auf 1 Stunde gesetzt
loginCookie.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Set(loginCookie);
Bei jeder Anfrage könntest du dann prüfen, ob der Cookie vorhanden ist und auch gleich abfragen, welcher Benutzername das ist.
-
Cookies sind generell "Nicht Vertrauenswürdige" Inhalte und daher ist es zu empfehlen (meiner Meinung nach) nur geringe u. relevante Information abzuspeichert.
Wie Bsp: Login-Felder damit befüllen oder LastLogin anzuzeigen.
Und die Werte im Cookie können zusätzlich verschlüsselt abgespeichert werden.
Lg
WaZZ