2015-08-14 19 views
13

Ho creato un auto di hosting Owin/SignalR app con codice simile al codice in questo tutorial:Specificare dominio in Owin avvio Classe

SignalR Self Host Tutorial

Tutto funziona, ma per la sicurezza-sake, I' Mi piacerebbe limitarlo per consentire solo i messaggi da un sito remoto specifico. In altre parole, mi piacerebbe sostituire "app.UseCors (CorsOptions.AllowAll);" linea con il codice per limitare l'app a rispondere solo ai messaggi da un URL che definisco, ad esempio consentire solo messaggi, ad esempio, http://www.remote_site.com o qualcosa del genere. C'è un modo semplice per farlo?

Per riferimento, ecco il codice per la mia SignalR classe di startup:

using System; 
using Microsoft.AspNet.SignalR; 
using Microsoft.Owin.Hosting; 
using Owin; 
using Microsoft.Owin.Cors; 

namespace SignalRSelfHost 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 
      app.MapSignalR(); 

     // How do I only allow a specific URL instead of the "CorsOptions.AllowAll" option?    
     } 
    } 
} 

risposta

19

Ecco la piena attuazione della classe Owin Startup:

using System.Threading.Tasks; 
using Microsoft.Owin; 
using Owin; 
using Microsoft.Owin.Cors; 
using System.Web.Cors; 

[assembly: OwinStartup(typeof(SignalRSelfHost.Startup))] 

namespace SignalRSelfHost 
{ 
    public class Startup 
    { 

     public void Configuration(IAppBuilder app) 
     { 
      var policy = new CorsPolicy() 
      { 
       AllowAnyHeader = true, 
       AllowAnyMethod = true, 
       SupportsCredentials = true 
      }; 

      policy.Origins.Add("domain"); //be sure to include the port: 
//example: "http://localhost:8081" 

      app.UseCors(new CorsOptions 
      { 
       PolicyProvider = new CorsPolicyProvider 
       { 
        PolicyResolver = context => Task.FromResult(policy) 
       } 
      }); 

      app.MapSignalR(); 
     } 
    } 
} 

Inoltre, se si vuole server per accettare un elenco di domini, è sufficiente aggiungerli allo Origins.

Spero che questo aiuti! In bocca al lupo!

+0

Sembra fantastico! Ho trovato una soluzione che ha impostato CorsOptions con un Lazy e un gruppo di lambda funzionante, ma non era così semplice. 1 !!! –

+0

Inizialmente ho visto questo metodo utilizzato da uno dei ragazzi che ha scritto SignalR, quindi andrei con questo :)) Ma se pensi che il tuo risolva il problema altrettanto bene, dovresti postarlo (nel caso in cui qualcun altro ne ha bisogno) e segnarne uno come risposta. Buona fortuna! –

5

Ecco il codice che ho citato in un commento sopra:

public class Startup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     app.UseCors(_corsOptions.Value); 
     app.MapSignalR(); 
    } 


    private static Lazy<CorsOptions> _corsOptions = new Lazy<CorsOptions>(() => 
    { 
     return new CorsOptions 
     { 
      PolicyProvider = new CorsPolicyProvider 
      { 
       PolicyResolver = context => 
       { 
        var policy = new CorsPolicy(); 
        policy.Origins.Add("http://localhost:8081"); 
        policy.AllowAnyMethod = true; 
        policy.AllowAnyHeader = true; 
        policy.SupportsCredentials = true; 
        return Task.FromResult(policy); 
       } 
      } 
     }; 
    }); 

} 

Questo funziona, ma penso che la risposta di Matei sopra è più pulita e più semplice.