2014-04-29 12 views
5

Ho un'app SignalR. ospitato in un servizio di Windows (usato ORA & Katana come self-hosting) ed è in ascolto su mydomain.com: 8080Come limitare le connessioni del server SignalR?

Sul medesimo server, ho anche un'applicazione MVC che è fondamentalmente un sito Web che si collega al mio hub SignalR che Ho menzionato sopra.

Voglio limitare l'accesso alla mia app SignalR solo alla mia applicazione MVC. Ho cercato su internet ma non ho seguito un esempio di questo.

È possibile raggiungere questo obiettivo? Come posso ottenere informazioni se la connessione proviene dalla mia app MVC o da un'altra app? Devo implementare un'autorizzazione per la mia applicazione MVC per potermi connettere alla mia applicazione SignalR?

In questo momento, tutti su Internet possono accedere a mydomain.com:8080/signalr endpoint che in pratica significa che un concorrente può codificare un client che si collega al mio hub SignalR e utilizzarlo. Quali sono le opzioni per prevenire questo scenario?

ps: Si prega di chiedere maggiori informazioni -se avete bisogno-invece di marcatura post come "non costruttiva" perché non so quanto questa domanda può essere chiesto di più "costruttivo"

risposta

8

credo avere un esempio di lavoro, è veloce e sporco, ma dovrebbe fare il lavoro, e si dovrebbe essere in grado di espandere in modo che sarà adatta meglio alle proprie necessità:

ho creato una classe che eredita da Microsoft.AspNet.SignalR.AuthorizeAttribute e sovrascritto AuthorizeHubConnection metodo:

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

tutto ciò che fa è controllare l'host/autorità dell'intestazione del Referer rispetto a uno codificato e restituisce true se corrispondono.

È quindi possibile utilizzare in questo modo:

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

If CustomAuthorize rendimenti falsi, la richiesta si fermerà lì. L'hub OnConnected() non verrà attivato.

+0

Impressionante, ci proverò appena torno a casa. Una domanda veloce però: l'host sarà sempre mydomain.com:8080 per ogni cliente che visita il sito? Immagino che l'applicazione mvc passi l'indirizzo host del client durante la connessione a SignalR, ho ragione? – Alaminut

0

Basta usare l'opzione cors invece di scrivere code.in cors consente solo il dominio

Problemi correlati