2014-04-29 15 views
5

Mam aplikację SignalR. hostowany w usłudze Windows (używał OWIN & Katana jako hosta) i nasłuchuje na mydomain.com: 8080Jak ograniczyć połączenia z serwerem SignalR?

Na tym samym serwerze mam również aplikację MVC, która jest w zasadzie witryną, która łączy się z moim koncentratorem SignalR, który Wspomniałem wyżej.

Chcę ograniczyć dostęp do mojej aplikacji SignalR tylko do mojej aplikacji MVC. Przeszukałem internet, ale nie podałem tego przykładu.

Czy można to osiągnąć? Jak mogę uzyskać informacje o tym, czy połączenie pochodzi z mojej aplikacji MVC lub z innej aplikacji? Czy muszę wprowadzić autoryzację dla mojej aplikacji MVC, aby móc połączyć się z moją aplikacją SignalR?

W tej chwili wszyscy w Internecie mają dostęp do mojego punktu końcowego mydomain.com:8080/signalr, co oznacza, że ​​konkurent może kodować klienta, który łączy się z moim koncentratorem SignalR i używa go. Jakie są opcje, aby zapobiec temu scenariuszowi?

PS: Proszę zapytać o więcej informacji -Jeśli potrzebujesz-zamiast po prostu oznaczenie posta jako „non konstruktywne”, bo nie wiem, jak to pytanie można zadawać bardziej „konstruktywne”

Odpowiedz

8

wierzę mieć działający przykład, jest szybki i brudny, ale powinien wykonać to zadanie, i powinieneś być w stanie go rozszerzyć, aby lepiej odpowiadał twoim potrzebom:

Utworzono klasę, która dziedziczy po Microsoft.AspNet.SignalR.AuthorizeAttribute i przeskoczyła AuthorizeHubConnection metoda:

[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; 
    } 
} 

Wszystko, co robi, to sprawdzenie hosta/organu nagłówkowego Referer na twardym, zakodowanym i zwraca wartość true, jeśli są zgodne.

Następnie można go używać tak:

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

If CustomAuthorize zwraca fałsz, prośba będzie tam zatrzymać. Koncentrator OnConnected() nie zostanie wyzwolony.

+0

Niesamowite, spróbuję, jak tylko wrócę do domu. Jedno szybkie pytanie: czy host zawsze będzie mojadomena.com: 8080 dla każdego klienta odwiedzającego stronę? Zgaduję, że aplikacja mvc przekazuje adres hosta klienta podczas łączenia się z SignalR, czy mam rację? – Alaminut

0

Po prostu użyj opcji cors zamiast wpisywania kodów. Pozwól swojej domenie tylko

Powiązane problemy