2014-04-29 9 views
5

Ich habe eine SignalR App. gehostet in einem Windows-Dienst (verwendet OWIN & Katana als Selbsthosting) und es hört auf mydomain.com: 8080Wie kann man SignalR Server Verbindungen einschränken?

Auf dem gleichen Server, habe ich auch eine MVC-Anwendung, die im Grunde eine Website ist, die zu meinem SignalR-Hub verbindet Ich habe das oben erwähnt.

Ich möchte den Zugriff auf meine SignalR App nur auf meine MVC-Anwendung beschränken. Ich habe das Internet durchsucht, bin aber nicht auf ein Beispiel gestoßen.

Ist es möglich, dies zu erreichen? Wie kann ich herausfinden, ob die Verbindung von meiner MVC-App oder von einer anderen App kommt? Muss ich eine Autorisierung für meine eigene MVC-Anwendung implementieren, um eine Verbindung zu meiner SignalR-Anwendung herstellen zu können?

Jetzt kann jeder im Internet auf mydomain.com:8080/signalr Endpunkt zugreifen, was im Grunde bedeutet, dass ein Konkurrent einen Client codieren kann, der eine Verbindung zu meinem SignalR-Hub herstellt und ihn verwendet. Was sind die Optionen, um dieses Szenario zu verhindern?

ps: Bitte um weitere Informationen bitten -wenn Sie statt bedarfs- nur den Posten als „nicht konstruktiv“ -Kennzeichnung, weil ich weiß nicht, wie diese Frage mehr „konstruktiv“ gefragt werden kann

Antwort

8

ich glaube ich ein funktionierendes Beispiel, es ist schnell und schmutzig, aber es sollte die Arbeit machen, und Sie sollten es erweitern können, damit es Ihren Bedürfnissen besser entspricht:

Ich habe eine Klasse erstellt, die von Microsoft.AspNet.SignalR.AuthorizeAttribute erbt und die AuthorizeHubConnection übersteuert Methode:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class CustomAuthorize : AuthorizeAttribute 
{ 

    public override bool AuthorizeHubConnection(Microsoft.AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, IRequest request) 
    { 
     string referer = request.Headers["Referer"]; 
     string authority = new Uri(referer).Authority; 
     if (authority == "mydomain.com:8080") 
     { 
      return true; 
     } 
     return false; 
    } 
} 

es prüft nur den Host/die Autorität des Referer-Headers auf einen fest codierten und gibt true zurück, wenn sie übereinstimmen.

können Sie dann wie folgt verwenden:

[CustomAuthorize] 
public class ChatHub : Hub 
{ 
    //Hub code here... 
} 

Wenn CustomAuthorize false zurückgibt, wird die Anforderung dort anhalten. Die OnConnected() des Hubs wird nicht ausgelöst.

+0

Super, ich werde es versuchen, sobald ich wieder nach Hause komme. Eine kurze Frage: Wird der Gastgeber für jeden Kunden, der die Website besucht, immer mydomain.com:8080 sein? Ich denke, die mvc-Anwendung übergibt die Host-Adresse des Clients während der Verbindung zu SignalR bin ich richtig? – Alaminut

0

Verwenden Sie einfach Option Cors statt Code zu schreiben.in Cors erlauben Sie nur Ihre Domain