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:
- 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)
- ü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)
- 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):
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 wurdeif (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.";
}
[feature request] (https://github.com/SignalR/SignalR/issues/635) erstellt in der SignalR GitHub Projektseite – eddo