2015-08-14 10 views
13

Utworzyłem własny hosting Owin/SignalR aplikację z kodem podobny do kodu w tym tutorialu:Określ domeny w Owin Startup Klasy

SignalR Self Host Tutorial

wszystko działa, ale dla bezpieczeństwa-sake, I” Chcemy go ograniczyć, aby zezwalać tylko na wiadomości z określonej witryny zdalnej. Innymi słowy, chciałbym zastąpić "appuseCors (CorsOptions.AllowAll);" linię z kodem, aby ograniczyć działanie aplikacji tylko do odpowiedzi na wiadomości z zdefiniowanego przeze mnie adresu URL, tzn. zezwalać tylko na wiadomości od, powiedzmy, http://www.remote_site.com lub coś podobnego. Czy jest jakiś łatwy sposób to zrobić?

Dla porównania, tutaj jest kod dla mojej klasie startowej SignalR:

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?    
     } 
    } 
} 

Odpowiedz

19

Oto pełna implementacja klasy 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(); 
     } 
    } 
} 

Ponadto, jeśli chcesz się z serwerem, aby zaakceptować listę domen, po prostu dodajesz je do Origins.

Mam nadzieję, że to pomoże! Powodzenia!

+0

To wygląda świetnie! Znalazłem rozwiązanie, które ustanowiło CorsOptions z Lazy i kilkoma lambdami, które działały, ale nie było to takie proste. +1 !!! –

+0

Początkowo widziałem tę metodę stosowaną przez jednego z facetów, którzy napisali SignalR, więc poszedłem z tym :)) Ale jeśli uważasz, że twój problem rozwiązuje równie dobrze, powinieneś go opublikować (na wszelki wypadek, gdyby ktoś inny potrzebuje tego) i zaznaczyć jedną z nich jako odpowiedź. Powodzenia! –

5

Oto kod, który już wspomniałem w komentarzu powyżej:

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

} 

To działa, ale myślę, że odpowiedź jest powyżej Matei jest czystsze i prostsze.

Powiązane problemy