Anmeldung mit DataSet

  • VB.NET

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von rLz4u.

    Anmeldung mit DataSet

    Hallo :)

    Ich möchte gerne eine Anmeldung (Benutzer + Passwort) mit Hilfe eines DataSets erstellen. In einem ButtonClick-Event wird dann geprüft, ob der Benutzername mit dem Passwort übereinstimmt.

    Genau hier ist mein Problem. :S Ich weiß nicht, wie ich die Abfrage erstelle.
    Hab in etwa an sowas gedacht...

    VB.NET-Quellcode

    1. Private Sub goNext(sender As System.Object, e As System.EventArgs) Handles goNext.Click
    2. 'Name of Dataset = Dt_oUserDataSet
    3. 'Name of Table = Tbl_LoginFile
    4. 'Name of Username = oUserAccount
    5. 'Name of Password = oUserPassword
    6. Dim DataViewBenutzer As DataView = Dt_oUserDataSet.Tables("oUserAccount").DefaultView
    7. Dim DataViewPasswort As DataView = Dt_oUserDataSet.Tables("oUserPassword").DefaultView
    8. If DataViewPasswort.GetType.ToString = pwd.Text Then
    9. MsgBox("OK")
    10. 'open next
    11. Else
    12. MsgBox("FAILED")
    13. 'do something
    14. End If
    15. End Sub
    der Code ist absolut mies und tw sogar sinnlos, dassis dir klar, odr?

    und zum Authentifizieren gibts einfach einen Stand der Technik, zB. wird das Passwort selbst garniemals nirgends abgespeichert, sondern nur eine daraus generierte Byte-Folge.

    guggemol Verschlüsseln + Autentifizieren
    Das Umwandeln in Bytes habe ich jetzt Danke eines Movie-Tuts so geschafft:

    VB.NET-Quellcode

    1. Private Function StringtoMD5(ByVal Content As String) As String
    2. Dim nsC As New System.Security.Cryptography.MD5CryptoServiceProvider
    3. Dim bString() As Byte = System.Text.Encoding.ASCII.GetBytes(Content)
    4. bString = nsC.ComputeHash(bString)
    5. Dim finalString As String = Nothing
    6. For Each bt As Byte In bString
    7. finalString &= bt.ToString("x2")
    8. Next
    9. Return finalString
    10. End Function


    Schlau genug, es wieder zu entschlüsseln, bin ich noch nicht. ;(

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StormySunshine“ ()

    StormySunshine schrieb:

    Schlau genug, es wieder zu entschlüsseln, bin ich noch nicht.
    Die MD5-Verschlüsselung ist ja auch nicht dafür konzipiert wieder entschlüsselt zu werden: man speichert ein verschlüsseltes Passwort und vergleicht den MD5Hash des eingebenen Pawworts mit dem gespeicherten Wert.

    StormySunshine schrieb:

    Das Umwandeln in Bytes habe ich jetzt Danke eines Movie-Tuts so geschafft
    Das war kein ganz so ideales Tutorial, obwohl es seinen Zweck erfüllt. Bei solchen String-Operationen nimmt man die Stringbuilder Klasse.

    Oder in diesem Fall noch einfacher: Dim finalString As String = BitConverter.ToString(bString).Replace("-"c, "")
    Naja, auch wenn Du den MD5-Hash eines Passwortes irgendwo auf Deinem PC speicherst, ists nicht sicher. Denn, dann tausche ich einfach den Hash durch einen mir bekannten Hash aus. Womöglich schau ich mit IL-Spy noch kurz in Deinen Code, um mich über den verwendeten Hash zu informieren. Du müsstest den Hash iwo speichern, wo man nicht so ohne Weiteres drankommt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Du müsstest den Hash iwo speichern, wo man nicht so ohne Weiteres drankommt.

    Wo wäre denn ein sicherer Ort? :D


    Das Login habe ich jetzt wie folgt geschrieben; und es funktioniert: :thumbsup:

    SQL-Abfrage

    1. SELECT COUNT(*) AS Result, UserName AS UserNameInput, UserPassword AS UserNamePassword
    2. FROM Users
    3. GROUP BY UserName, UserPassword
    4. HAVING (UserName = ?) AND (UserPassword = ?) AND (COUNT(*) = 1)

    VB.NET-Quellcode

    1. Dim r = Me.UsersTableAdapter.ValidateUserNamePassword(txtUsername.Text, txtPassword.Text)
    2. If r Is Nothing Then
    3. MsgBox("Username or Password is wrong!")
    4. Else
    5. MsgBox("Welcome")
    6. End If
    Okay. :) Da ich kein Server habe und Visual Studios (vorerst) nur privat nutze und das Tutorial nur zum Lernen ist, ohne schützenswerte Daten, dürfte mir das so auch reichen. ;)

    Jetzt habe ich nur das Problem, dass ich das Passwort verschlüsselt habe und dieses im MD5-Format im DataSet gespeichert wird.

    Bsp.: "1234" = "81dc9bdb52d04dc20036dbd8313ed055"


    In meinem Login frage ich das Passwort ab, und wenn ich "1234" eingebe, bekomme ich den Fehler, dass BN+PW nicht stimmen. Was muss ich als nächstes tun? :S
    Versuchst du jetzt ein Passwort aus ner Textbox mit dem Passwort-Hash im Dataset zu vergleichen?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Na wenn du nen Hash im Dataset hast und willst prüfen ob der Benutzer in der Textbox das richte Passwort eigegeben hat, musst du den Inhalt der Textbox logischerweise auch hashen und den erzeugten Hash mit dem Hash im Dataset vergleichen.

    Oder ich verstehe nicht recht was dein Problem ist ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Vielleicht gibt Dir das ein paar Anhaltspunkte. Ein Tip von mir. Erstelle immer einen Hash aus UserName und Password.

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Imports System.Text
    3. Public Class Form1
    4. Private Function HashUserInformation(ByVal userName As String, ByVal password As String) As String
    5. Dim pBytes() As Byte = Encoding.UTF8.GetBytes(userName & password)
    6. 'Hash wird aus UserName und Password gebildet
    7. Dim hBytes() As Byte = New MD5CryptoServiceProvider().ComputeHash(pBytes)
    8. Return BitConverter.ToString(hBytes).Replace("-", "")
    9. End Function
    10. Private Sub AddNewUser(ByVal userName As String, ByVal password As String)
    11. Dim hPassword As String = HashUserInformation(userName, password)
    12. Me.UserDataSet1.Users.AddUsersRow(userName, hPassword)
    13. End Sub
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. 'Nur zur Demo einen User anlegen.
    16. AddNewUser("SpaceyX", "myPassword")
    17. End Sub
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. If Not Me.TextBox1.Text = "" AndAlso Not Me.TextBox2.Text = "" Then
    20. Dim userName As String = Me.TextBox1.Text
    21. Dim password As String = Me.TextBox2.Text
    22. Dim result = From p In Me.UserDataSet1.Users Where p.UserName = userName Select p.PasswordHash
    23. If result.Count = 1 Then
    24. Dim givenPassword As String = HashUserInformation(userName, password)
    25. If givenPassword = result(0) Then
    26. MessageBox.Show("Login OK")
    27. Else
    28. MessageBox.Show("Passwort nicht korrekt")
    29. End If
    30. Else
    31. MessageBox.Show("Dieser User existiert nicht")
    32. End If
    33. End If
    34. End Sub
    35. End Class


    Ein Bild der DataTable findest Du im Anhang.

    Wie gesagt, ist ein BeispielCode, keine Lösung.
    Bilder
    • Unbenannt.JPG

      14,43 kB, 224×173, 388 mal angesehen
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    Dem DataSet kann man keine CheckBoxen hinzufügen.

    Du kannst dem DataSet eine weitere Spalte mit dem DatenTyp Boolean hinzufügen, welche angibt, ob der User gesperrt ist oder nicht. Hier wird auch nicht mit SQL gearbeitet, sondern mit LINQ.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. If Not Me.TextBox1.Text = "" AndAlso Not Me.TextBox2.Text = "" Then
    3. Dim userName As String = Me.TextBox1.Text
    4. Dim password As String = Me.TextBox2.Text
    5. Dim result = From p In Me.UserDataSet1.Users Where p.UserName = userName Select p
    6. If result.Count = 1 Then
    7. If result(0).IsClosedOff Then
    8. MessageBox.Show("Dieser User ist gesperrt")
    9. Exit Sub
    10. End If
    11. Dim givenPassword As String = HashUserInformation(userName, password)
    12. If givenPassword = result(0).PasswordHash Then
    13. MessageBox.Show("Login OK")
    14. Else
    15. MessageBox.Show("Passwort nicht korrekt")
    16. End If
    17. Else
    18. MessageBox.Show("Dieser User existiert nicht")
    19. End If
    20. End If
    21. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Du kannst dem DataSet eine weitere Spalte mit dem DatenTyp Boolean hinzufügen, welche angibt, ob der User gesperrt ist oder nicht.

    So meinte ich das ja auch. :D
    Jetzt habe ich auch verstanden, wie ich den Wert abfragen kann. Danke Dir vielmals.... :thumbsup:


    Nun habe ich ff. Code stehen:
    Mein Code

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim result = From u In Me.UserPasswordDataSetDataSet.Users Where u.UserName = userName Select u
    3. If result.Count = 1 Then
    4. If result(0).IslockedNull Then
    5. Dim r = Me.UsersTableAdapter.ValidateUserNamePassword(txtUsername.Text, txtPassword.Text)
    6. If r Is Nothing Then
    7. MsgBox("Username or Password is wrong!")
    8. txtPassword.Clear()
    9. Else
    10. 'do something
    11. End If
    12. Else
    13. MsgBox("Error:" & vbTab & "This Account has been blocked. Please contact the Administrator.")
    14. Exit Sub
    15. End If
    16. Else : MsgBox("Error:" & vbTab & "This account does not exist.")
    17. End If
    18. End Sub


    Wenn ich nun den Wert der CheckBox auf "False" setze, ist der Account entsperrt. Trotzdem bekomme ich die Meldung, der Account sei gesperrt. ?(

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „StormySunshine“ ()

    Wenn Du Dein DataSet an ein DataGridView bindest, bzw. Dein DataSet an eine BindingSource, die an das DataSet gebunden ist, kannst Du Dir wunderbar eine CheckBox im DataGridView erstellen. Hab extra für Dich ein Video gemacht, wo ich Dir zeige, was ich meine. Leider immer noch ohne Ton, da ich heute nicht zum Einkaufen gekommen bin, wie ich es vor hatte.

    youtube.com/watch?v=4FSKJUmpvRk&feature=youtu.be

    Hier nochmal der komplette Code:

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Imports System.Text
    3. Public Class Form1
    4. Private Function HashUserInformation(ByVal userName As String, ByVal password As String) As String
    5. Dim pBytes() As Byte = Encoding.UTF8.GetBytes(userName & password)
    6. Dim hBytes() As Byte = New MD5CryptoServiceProvider().ComputeHash(pBytes)
    7. 'Hash wird aus UserName und Password gebildet
    8. Return BitConverter.ToString(hBytes).Replace("-", "")
    9. End Function
    10. Private Sub AddNewUser(ByVal userName As String, ByVal password As String)
    11. Dim hPassword As String = HashUserInformation(userName, password)
    12. Me.UserDataSet1.Users.AddUsersRow(userName, hPassword, True)
    13. End Sub
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. 'Nur zur Demo einen User anlegen.
    16. AddNewUser("SpaceyX", "myPassword")
    17. End Sub
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. If Not Me.TextBox1.Text = "" AndAlso Not Me.TextBox2.Text = "" Then
    20. Dim userName As String = Me.TextBox1.Text
    21. Dim password As String = Me.TextBox2.Text
    22. Dim result = From p In Me.UserDataSet1.Users Where p.UserName = userName Select p
    23. If result.Count = 1 Then
    24. If result(0).IsClosedOff Then
    25. MessageBox.Show("Dieser User ist gesperrt")
    26. Exit Sub
    27. End If
    28. Dim givenPassword As String = HashUserInformation(userName, password)
    29. If givenPassword = result(0).PasswordHash Then
    30. MessageBox.Show("Login OK")
    31. Else
    32. MessageBox.Show("Passwort nicht korrekt")
    33. End If
    34. Else
    35. MessageBox.Show("Dieser User existiert nicht")
    36. End If
    37. End If
    38. End Sub
    39. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    40. Dim userName As String = Me.TextBox1.Text
    41. Dim passWord As String = Me.TextBox2.Text
    42. Dim hPassword As String = HashUserInformation(userName, passWord)
    43. Try
    44. Me.UserDataSet1.Users.AddUsersRow(userName, hPassword, False)
    45. Catch ex As System.Data.ConstraintException
    46. MessageBox.Show("Dieser User existiert bereits")
    47. End Try
    48. End Sub
    49. End Class


    Im Anhang nochmal ein Bild vom DataSet und die Projektmappe zum selber ausprobieren.
    Bilder
    • Unbenannt.JPG

      15,17 kB, 252×268, 170 mal angesehen
    Dateien
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()