Entwickler-Ecke

WinForms - User Login mit SMS


nav93 - Do 16.11.17 12:37
Titel: User Login mit SMS
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 - 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:


Aus meiner Sicht relativ simpel.

Und was das Versenden von SMS geht, hab ich auf die Schnelle das gefunden:
https://www.smsapi.com/libraries?gclid=EAIaIQobChMIkcy-yv7C1wIVEGwbCh0-JQDJEAAYAiAAEgInwfD_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 - 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 - 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


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) [http://www.entityframeworktutorial.net]
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 [http://openbook.rheinwerk-verlag.de/visual_csharp_2012/] (aktuelle aber kostenpflichtige Version: C# 6 mit Visual Studio 2015 [https://www.rheinwerk-verlag.de/c-6-mit-visual-studio-2015_3819/]) 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 [https://msdn.microsoft.com/de-de/library/system.xml.serialization.xmlserializer(v=vs.110).aspx] 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:


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 - 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.