2012-08-28 4 views
10

Diese Frage steht im Zusammenhang mit einem anderen Thread, können Sie lesen wo ich mit der Hilfe und Geduld des Benutzers dfowler versucht zu verstehen, wie erzwingen Formen ASP .NET Forms-Authentifizierung auf ein SignalR Hub.SignalR: wie erzwingen Authentifizierung/terminieren Hub-Verbindungen Serverseite

Beschreibung des Problems: Ich möchte, dass nur authentifizierte Benutzer den SignalR Hub verbinden und Nachrichten empfangen/senden können.

Intrusionsszenario: Der Eindringling kann möglicherweise HTML und Javascripts der Webseite erfassen und darauf zugreifen, indem er auf die temporären Dateien auf einem Clientcomputer zugreift. Dieser Eindringling kann daher alle Details (Methoden, Hubnamen usw.) kennen, die zum Einrichten/Verwenden einer Verbindung zum Hub erforderlich sind. Eine vorgeschlagene Lösung von dfowler ist implementing IConnect:

Sie würden IConnected implementieren und den folgenden Code in Connect schreiben if (Context.User.Identity.IsAuthenticated!) Throw new Exception ("GTFO");

Deshalb habe ich versucht, mit so etwas wie dieses

public System.Threading.Tasks.Task Connect() 
    { 
     if (!Context.User.Identity.IsAuthenticated 
      || !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2") 
      )) 
      throw new Exception("User not authorized"); 
     return null; 
    } 

Das Problem, einmal getestet, ist, dass, wenn die Connect-Methode aufgerufen wird, wird die Verbindung bereits eingerichtet wurde und schlicht die Ausnahme werfen wird nicht helfen (Wenn ich richtigerweise infos habe, sollte Connect verwendet werden, um eine Nachricht an den Client bei der Verbindung zu senden, wird das Werfen einer Ausnahme nur in einer Willkommensnachricht nicht gesendet).

In den Tatsachen, von meinen Tests, können die Klienten noch alle Mitteilungen lesen (und sie auch senden).

nun Ansätze, die kommen mir in den Sinn:

  1. Perfekte Lösung: ablehnen oder die Verbindung auf Server-Seite beenden: keine Ahnung, wie diese in SignalR zu tun (ich versuchte, ein Verfahren, in dem finden API aber kein Glück)
  2. überprüfen, ob der Benutzer eines Teil einer Gruppe Nachrichten an ihn zu vermeiden, ist Empfangen/Senden (aber das ist immer noch anfällig für Überschwemmungen/DoS-Attacken)
  3. eine Nachricht an den Client gesendet zu trennen: offensichtlich hilft nicht, falls ich einen Eindringling bekämpfe.

Irgendein anderer Ansatz? Irgendeine Möglichkeit, die Verbindung auf der Serverseite zu beenden, oder sollte akzeptiert werden, dass die einzige echte Authentifizierung diejenige der Host-Webseite ist (was die Tür zu allen signalR-Client-Angriffen offen lässt?

)

EDIT

Hier ist die Folge von Client - Kommunikationsserver, wenn ich die IConnect.Connect Methode verwenden, werfen bedingungslos eine Ausnahme (Browser IE9):

client-server communication when Connect throws exception

Es sieht aus wie die foreverFrame schlägt fehl, aber das longPolling-Fallback wird eingerichtet und funktioniert trotzdem - dies nachdem der Fehler im Javascript durch den Block

erfasst wurde
if (connection.state === signalR.connectionState.connecting) { 
      // Connection hasn't been started yet 
      throw "SignalR: Connection has not been fully initialized. 
    Use .start().done() or .start().fail() to run logic after 
    the connection has started."; 
     } 
+0

[feature request] (https://github.com/SignalR/SignalR/issues/635) erstellt in der SignalR GitHub Projektseite – eddo

Antwort

5

Wir haben ein Problem, bei dem wir die Verbindung insgesamt blockieren müssen. Im Moment musst du jede Methode überwachen. Es ist nicht das sauberste, aber für 1.0 alpha1 haben wir einen Mechanismus dafür.

Ein zusätzliches Problem ist, dass es die gleiche Verbindung für alle Hubs ist, so dass Sie eine Verbindung für einen bestimmten Hub nicht ablehnen können.

EDIT

Eigentlich, wenn Sie es nicht beenden Sie die Verbindung so weit meine Prüfung geht werfen. Welches Verhalten siehst du?

+0

Verstanden jetzt - offensichtlich sind die Dinge komplizierter als ein erster Gedanke, wie üblich. Dies ist jedoch ein großes Problem, da es SignalR nicht für Unternehmensanwendungen geeignet macht und eine große Sicherheitsbedrohung darstellt - bitte geben Sie diesem eine Priorität ... Über die automatische Wiederverbindung habe ich einige Details in der Frage selbst hinzugefügt - Entschuldigung, so ein Schmerz zu sein, dfowler :) – eddo

+0

meine twopence - um den Hub zu verbinden, muss der Client bekommen ''. Wäre es nicht möglich, die Serverseite durch ASP.NET-Authentifizierung zu gehen? Nicht sicher, ob dieser Ansatz auch auf den SignalR.Client erweitert werden kann ... – eddo

+0

Das stimmt nicht. Das ist ein generierter Proxy für die Bequemlichkeit, hat nichts damit zu tun, dass Sie sich mit einem Hub verbinden können oder nicht. Das einzige, was wir hinzufügen müssen (und wir werden es tun), ist eine saubere Möglichkeit, Verbindungen vollständig abzulehnen, basierend auf einer benutzerdefinierten Logik. Die Authentifizierung findet innerhalb von SignalR selbst niemals statt. Aber Sie können in SignalR überprüfen und verifizieren. Wenn Sie dies heute wirklich zum Laufen bringen müssten, könnten Sie ein ASP.NET-Modul schreiben und Anfragen an den Signalgeber kurzschließen, aber das ist schmerzhaft. – davidfowl