Wie stelle ich sicher, dass ein Benutzer nur einmal angemeldet ist?

8

Vor einigen Jahren habe ich eine Web-App entwickelt, bei der wir sicherstellen wollten, dass die Benutzer keine Anmeldeinformationen teilen.

Eines der Dinge, zu dem wir uns entschlossen haben, war, dass der Benutzer nur von einem Computer zu einem Zeitpunkt angemeldet werden konnte. Die Art, wie ich das gemacht habe, war ein kleiner iFrame, der alle N Sekunden den Server anpingt; Solange der Server einen Heartbeat für einen bestimmten Benutzer (von einer bestimmten IP) hatte, durfte sich dieser Benutzer nicht von einer anderen IP-Adresse aus anmelden.

Die Lösung, obwohl von meiner Krippe genehmigt, schien mir immer hacky. Außerdem scheint es, als wäre es leicht zu umgehen.

Gibt es eine gute Möglichkeit, sicherzustellen, dass sich ein Web-App-Benutzer nur einmal anmeldet? Um ehrlich zu sein, habe ich nie verstanden, warum das Management diese Funktion überhaupt wollte. Macht es Sinn, dies auf verteilten Apps zu erzwingen?

    
Esteban Araya 25.09.2008, 23:22
quelle

7 Antworten

11

Ich habe dies implementiert, indem ich eine Hashtabelle der aktuell angemeldeten Benutzer beibehalte, der Schlüssel war der Benutzername, der Wert war ihre letzte Aktivitätszeit.

Wenn Sie sich anmelden, überprüfen Sie einfach diese Hashtabelle für den Schlüssel, und wenn sie existiert, lehnen Sie die Anmeldung ab.

Wenn der Benutzer etwas tut, aktualisieren Sie die Hashtabelle mit der Zeit (Dies ist einfach, wenn Sie sie zum Kernseitenframework machen).

Wenn die Zeit in der Hashtabelle mehr als 20 Minuten Inaktivität beträgt, entfernen Sie sie. Sie können dies jedes Mal tun, wenn die Hashtabelle aktiviert ist. Selbst wenn Sie nur einen Benutzer hatten und sich mehrere Stunden später bei dieser ersten Überprüfung anmeldeten, würden Sie sie aus der Hashtabelle entfernen, um inaktiv zu bleiben.

Einige Beispiele in C # (ungetestet):

%Vor%     
FlySwat 25.09.2008, 23:31
quelle
4

Ich würde das Problem umgehen und die letzte Anmeldung auf Kosten einer früheren Anmeldung zulassen. Wenn sich ein Benutzer anmeldet, müssen Sie alle anderen Anmeldesitzungen beenden.

Dies ist viel einfacher, es umzusetzen, und Sie am Ende wissen, wo Sie sind.

    
AJ. 26.09.2008 10:20
quelle
4

Wenn du an einem "Feature" wie diesem gearbeitet hast, sei gewarnt - dies ist eine Elefantenfalle von Randfällen, in denen du am Ende denkst, du hättest es genagelt und dann sagst du oder jemand anderes "Aber was, wenn jemand X gemacht hat?" und Sie erkennen, dass Sie eine weitere Ebene der Komplexität hinzufügen müssen.

Zum Beispiel:

  • Was ist, wenn ein Benutzer eine neue Registerkarte mit einer Kopie der Sitzung öffnet?
  • Was passiert, wenn der Benutzer ein neues Browserfenster öffnet?
  • Was ist, wenn sich der Benutzer anmeldet und sein Browser abstürzt?

und so weiter ...

Grundsätzlich gibt es eine Reihe von mehr oder weniger hacky Lösungen, von denen keine idiotensicher sind und die alle schwer zu pflegen sind. In der Regel ist das eigentliche Ziel des Clients ein anderes legitimes Sicherheitsziel, wie zum Beispiel "Benutzer nicht mehr mit Accounts teilen".

Die beste Idee ist es herauszufinden, was das zugrunde liegende Ziel ist und einen Weg zu finden, dem zu entsprechen. Und ich fürchte, das beinhaltet Verhandlungsdiplomatie und andere solche "Soft Skills", anstatt sich auf eine technische Wildgansjagd einzulassen ..,

    
domgblackwell 26.09.2008 12:15
quelle
3

Nur IP zu betrachten kann unzuverlässig sein. IIRC gibt es einige Arten von Proxy, die ausgehende Anfragen zufällig über mehrere IP-Adressen farmen. Je nach Umfang Ihrer Bewerbung kann dies Auswirkungen auf Sie haben oder nicht. Andere Proxies zeigen eine Menge Datenverkehr von einer einzigen IP.

Die letzte Anmeldezeit kann ebenfalls ein Problem sein. Berücksichtigen Sie die Cookie-basierte Authentifizierung, bei der Cookies zur Authentifizierung nicht persistent sind (eine gute Sache). Wenn der Browser abstürzt oder geschlossen wird, muss sich der Benutzer wieder anmelden, kann jedoch nicht bis zum Ablauf des Zeitlimits. Wenn die App für den Handel mit Aktien ist, kostet 20 Minuten nicht arbeiten Geld und ist wahrscheinlich inakzeptabel.

Normalerweise können intelligente Firewalls / Router gekauft werden, die einen besseren Job machen als Sie oder ich als Einzelanwender. Sie helfen auch, Replay-Angriffe, Cookie-Stehlen usw. zu verhindern und können so konfiguriert werden, dass sie neben Standardmechanismen in Ihrer bevorzugten Web-Plattform laufen.

    
Robert Paulson 26.09.2008 00:10
quelle
1

In einer hochsicheren Anwendung müssen Sie möglicherweise dazu aufgefordert werden. Was Sie tun können, ist eine Anmeldeanzahl zu halten, die für den angemeldeten Benutzer und die IP-Adresse erhöht wird. Die Zählung sollte niemals 2 sein. Wenn es dann ist, loggt man die andere IP aus und wer auch immer in diese IP eingeloggt wird, wird rausgeworfen. Das wird nicht verhindern, dass Benutzer-1 Benutzer-2 seine Anmeldeinformationen gibt, es wird es nur frustrierend für Benutzer-1 machen, seine Arbeit zu tun, wenn sich Benutzer-2 an anderer Stelle zur gleichen Zeit anmeldet.

    
Taptronic 25.09.2008 23:27
quelle
1

Ich habe noch nie eine Standardlösung für dieses Problem gefunden. In einer meiner Apps verwendete ich eine Kombination aus Javascript + Java, um sicherzustellen, dass ein Benutzer nur einmal von einer bestimmten IP (tatsächlich war es eine Sitzungs-ID) protokolliert werden konnte, im schlimmsten Fall jedoch für eine Zeitüberschreitung (auf 2 Minuten) war das Konto nicht verfügbar. Ich weiß nicht, warum es keinen gemeinsamen Weg gibt.

    
Enrico Murru 25.09.2008 23:27
quelle
1

Ich hatte gerade dieses Problem.

Wir haben eine Drupal-Site erstellt, die eine Flex-App enthielt (vom Client erstellt), und er wollte Folgendes:

  1. transparente Anmeldung von Drupal & lt; - & gt; Flex (bleh!)
  2. keine gleichzeitigen Anmeldungen !!

Er hat den Mist jeder Lösung getestet und am Ende haben wir das gemacht:

  • Wir haben die Sitzungs-ID über jede URL weitergegeben.
  • Wenn der Benutzer sich angemeldet hat, haben wir einen Timestamp-IP-SessionID-Username-Footprint
  • eingerichtet
  • Auf jeder Seite wurde die Datenbank angepingt, und wenn derselbe Benutzer mit derselben IP-Adresse und mit einer anderen Sitzungs-ID gefunden wurde, wurde der ältere Benutzer gestartet

Diese Lösungen erfüllten die strengen Tests unseres Kunden (zwei Computer in seinem Haus ... er hielt uns stundenlang auf und fand kleine Lücken im Code, bevor wir zu dieser Lösung kamen)

    
Pete Karl II 26.09.2008 01:37
quelle

Tags und Links