Autor Beitrag
nav93
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Do 16.11.17 12:37 
Guten Morgen,

ich habe zurzeit ein kleines Projekt in Planung. Dabei wäre ein wichtiger Bestandteil, dass ich ein Login für meine WinForm Applikation habe. Am besten eine Art dynamisches Passwort.

Ein einfaches Szenario -> der User bekommt eine SMS mit einem Code , welcher das Passwort ist beim Login.

Meine Frage, ist dies leicht zu implementieren? Umsetzbar? oder gibt es auch andere Möglichkeiten für ein derartiges Problem. Es wäre einfach wichtig, dass ein Benutzer nicht bei jedem Login das gleiche Passwort hat.

vielen Dank schon mal
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.11.17 13:28 
"leicht" liegt immer im Auge des Betrachters ;)

Wenn Du das mit dem Senden der SMS als leicht betrachtest, würde ich den Rest auch als leicht einschätzen.
Mein Hauptproblem würde ich genau da sehen: Wie zum Teufel schickt man eine SMS? :D

Du brauchst also in erster Linie ein Konto, wo auch die Handynummer drin steht.
Zusätzlich brauchst Du in diesem Konto zwei Felder, eins für den PIN, der verschickt wird und eins, wann es verschickt wurde.

Der Ablauf mein Login würde mMn. dann so aussehen:

  • User will sich einloggen und bekommt mitgeteilt
  • User bekommt angezeigt: "Wir schicken dir einen Code und Du hast 5 Minuten Zeit, den einzugeben."
  • User klickt auf OK
  • Server generiert Code, danach
    • schreibt er ihn ins Benutzerprofil
    • schreibt den aktuellen Zeitpunkt ins Profil
    • schickt die SMS mit dem Code zum Benutzer
  • User gibt Code ein
  • Server hat folgende Optionen:
    • Code stimmt:
      • Ist Generierung weniger als 5 Minuten her?
        • Ja: Login durchführen
        • Nein: Fehlermeldung
    • Code stimmt nicht: Fehlermeldung



Aus meiner Sicht relativ simpel.

Und was das Versenden von SMS geht, hab ich auf die Schnelle das gefunden:
www.smsapi.com/libra...AAEgInwfD_BwE#csharp

Was dahinter steht und wie viel Zeit das kostet, musst Du heraus finden.


PS:
Das mit dem Zeitraum hab ich natürlich dazu gedichtet. ;)
Hauptsächlich, weil ich dieses Verhalten z.B. von Paypal kenne und wenn es wirklich um Sicherheit geht, sollte so ein Code nicht ewig existieren.

Dazu kommen dann natürlich noch andere Fragen nach der Sicherheit, wie z.B. eine verschlüsselte Verbindung.

Man könnte ja auch noch einbauen, dass der generierte Code nur von der IP akzeptiert wird, von der die Anfrage vorher aus ging
nav93 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Do 16.11.17 15:31 
vielen Dank für deine Antwort. Deine Ablaufbeschreibung trifft zu 100% zu. Genau so habe ich mir das vorgestellt. quasi eine Anmeldemaske, mit einem bestimmten Benutzernamen,
das Passwort per SMS. Eine Frage jedoch zum Verständnis, wie würde das funktionieren mit der Schnittstelle des Servers, das quasi der Code der SMS das Passwort ist.

Dieser Schritt :


•Server generiert Code, danach
◦schreibt er ihn ins Benutzerprofil
◦schreibt den aktuellen Zeitpunkt ins Profil
◦schickt die SMS mit dem Code zum Benutzer
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.11.17 16:19 
Du hast eine Datenbank mit einer Tabelle UserProfile
Diese Tabelle enthält irgendwelche User-Informationen und was Du sonst noch so brauchst.
Zusätzlich hat sie die Spalten

  • CurrentLoginCode
  • CurrentLoginCodeCreationTimestamp


Diese beiden Spalten muss der Server schreiben können. Wie das geht, da gibt's Möglichkeiten wie Sand am Meer.
Die einfachste Möglichkeit ist ein ORM (Object Relation Manager), z.B. EntityFramework (EF)
Wenn Du alles "per Hand" machen willst, also auch die SQL-Statements selber schreiben, dann ist ADO.NET dein Stichwort.
Beides findest Du aber gut in dem Buch Visual C# 2012 (aktuelle aber kostenpflichtige Version: C# 6 mit Visual Studio 2015) beschrieben, zusammen mit WPF (als moderne Alternative zu WinForms) und allgemeinen Grundlagen.

Wenn Du keine Datenbank hast (ist nicht unbedingt zu empfehlen), dann tut's auch XML.
In dem Fall ist der XmlSerializer gerade für Anfänger das Beste. Alternativ gibt's auch noch LINQ to XML, was beim Serialisieren/Deserialisieren mehr Möglichkeiten bietet.

Wie das konkret geht, kann ich dir also nicht sagen, da es zu viele Möglichkeiten gibt, zwischen denen Du dich erst entscheiden musst.
Da ist's definitiv einfacher, wenn Du dir die nötigen Grundlagen aneignest.
Dazu gibt's dann auch Hilfe und Beispiele in rauen Mengen.


Wenn Du dich für EF entscheidest und die Datenschicht mit EF fertig implementiert hast, könnte der Abschnitt so aussehen:

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:
// Diese Property stellt die Datenbank-Verbindung dar
// Richtig eingerichtet reicht ein einfaches new MyDbContext()
public MyDbContext MyDbContext { get; }

public void PrepareLogin(string username)
{
    var profile = GetUserProfile(username);
    var loginCode = CreateNewLoginCode();

    profile.CurrentLoginCode = loginCode;
    profile.CurrentLoginCodeCreationTimestamp = DateTime.Now;
    MyDbContext.SaveChanges(); // EF verfolgt die Änderungen und speichert sie gesammelt

    SendLoginCodeSMS(profile.MobileNr, loginCode);
}

UserProfile GetUserProfile(string username)
{
    return MyDbContext.UserProfiles.Single(x => x.UserName == userName);
}
string CreateNewLoginCode()
{
    var existingCodes = MyDbContext.UserProfiles
        .WHere(x => (DateTime.Now - x.CurrentLoginCodeCreationTimestamp) < TimeSpan.FromMinutes(5))
        .Select(x => x.CurrentLoginCode);

    // Hier den Code generieren
    // Achte aber darauf, dass der noch nicht existiert,
    // sonst könnte sich jemand mit seinem Code bei einem anderen Profil anmelden
    // Ist zwar unwahrscheinlich, dass das wer tut, aber es tut nicht weh, das auszuschließen
}
void SendLoginCodeSMS(string mobileNr, string loginCode)
{
    // Das musst Du selber heraus finden
}
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 17.11.17 12:26 
Typische Preise sind jedenfalls ca. 5-10 Cent pro SMS. Es gibt aber auch Paketpreise.

Zuerst müsstest du dir auf jeden Fall den Anbieter auswählen, über den die SMS verschickt werden sollen, dann gibt es dort meistens auch eine .NET Schnittstelle. Deren Nutzung ist meistens wirklich simpel.