2014-11-17 11 views
7

başlığını eklemiyor here numaralı açıklandığı gibi DynamicPolicyProviderFactory kullanıyorum.CORS etkin Web API'sı

<MyApp.Properties.Settings> 
    <setting name="AllowedDomains" serializeAs="Xml"> 
    <value> 
     <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <string>http://localhost</string> 
     <string>http*://*.domain1.com</string> 
     <string>http*://*.domain2.com</string> 
     </ArrayOfString> 
    </value> 
    </setting> 
</MyApp.Properties.Settings> 

: cors geçirilen WebApiConfig.cs
config.EnableCors(); 
config.SetCorsPolicyProviderFactory(new DynamicPolicyProviderFactory(Settings.Default.AllowedDomains)); 

Ve uygulama ayarlarını kazanmak kayıt

public class DynamicPolicyProviderFactory : ICorsPolicyProviderFactory 
{ 
    private readonly HashSet<Regex> _allowed; 

    public DynamicPolicyProviderFactory(IEnumerable allowedOrigins) 
    { 
     _allowed = new HashSet<Regex>(); 

     foreach (string pattern in allowedOrigins.Cast<string>() 
      .Select(Regex.Escape) 
      .Select(pattern => pattern.Replace("*", "w*"))) 
     { 
      _allowed.Add(new Regex(pattern, RegexOptions.IgnoreCase)); 
     } 

     if (_allowed.Count >= 1) 
      return; 

     //if nothing is specified, we assume everything is. 
     _allowed.Add(new Regex(@"https://\w*", RegexOptions.IgnoreCase)); 
     _allowed.Add(new Regex(@"http://\w*", RegexOptions.IgnoreCase)); 
    } 

    public ICorsPolicyProvider GetCorsPolicyProvider(HttpRequestMessage request) 
    { 
     var route = request.GetRouteData(); 
     var controller = (string)route.Values["controller"]; 
     var corsRequestContext = request.GetCorsRequestContext(); 
     var originRequested = corsRequestContext.Origin; 
     var policy = GetPolicyForControllerAndOrigin(controller, originRequested); 
     return new CustomPolicyProvider(policy); 
    } 

    private CorsPolicy GetPolicyForControllerAndOrigin(string controller, string originRequested) 
    { 
     // Do lookup to determine if the controller is allowed for 
     // the origin and create CorsPolicy if it is (otherwise return null) 

     if (_allowed.All(a => !a.Match(originRequested).Success)) 
      return null; 

     var policy = new CorsPolicy(); 
     policy.Origins.Add(originRequested); 
     policy.Methods.Add("GET"); 
     policy.Methods.Add("POST"); 
     policy.Methods.Add("PUT"); 
     policy.Methods.Add("DELETE"); 
     return policy; 
    } 
} 

public class CustomPolicyProvider : ICorsPolicyProvider 
{ 
    private readonly CorsPolicy _policy; 

    public CustomPolicyProvider(CorsPolicy policy) 
    { 
     this._policy = policy; 
    } 

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return Task.FromResult(this._policy); 
    } 
} 

Benim çağrı: Aşağıda DynamicPolicyProviderFactory benim sürümüdür

Bu ayarlara rağmen, Access-Control-Allow-Origin başlığım r'de yok http://mg.domain1.com'dan http://localhost'a bir istekte bulunursam esponses. Web Api 2.2 ve Microsoft.AspNet.Cors 5.2.2 kullanıyorum.

düzenleme: buldum ben denetleyicisinde EnableCors özelliğini kullanın veya benim dinamik fabrika şey olmalı bu yüzden, çalışır küresel (config.EnableCors(new EnableCorsAttribute("*", "*", "*"));) etkinlestirdiginizde. Sinir bozucu olan, DynamicPolicyProvider'ın iyi çalıştığım başka bir projeden kopyalanması/yapıştırılmasıdır.

düzenlemek 2:! Başarı ... Ben tracing etkin ve hatayı Yani sadece bunlara izin verecek şekilde GetPolicyForControllerAndOrigin yöntemi düzenlenmiş

The collection of headers 'accept,content-type' is not allowed 

bulundu. Şimdi her şey çalışıyor, çünkü kafamın dışında başka bir projede (DynamicPolicyProviderFactory'den kopyaladığım) bu kasnaktan atlamak zorunda kalmadım.

+1

CORS kurulumunu, her birinin "neredeyse işe yaradığı" ve belgelerin korkunç olduğunu, her yere yerleştirilebilmesinin nasıl yapılabileceğine dair birçok farklı yolla yaptıklarını ve yarısını ikiye katlamadıklarını görmek inanılmaz. çalışmasını sağlamak için uygulanması gerekiyordu. – pootzko

+0

@pootzko Kesinlikle katılıyorum! Ayrıca Mike_G, DynamicPolicyProviderFactory.cs dosyasını kök klasörüne koyabilir miyim yoksa belirli bir klasöre mi gitmeliyim? Bu nedir: ', Web.config dosyasında hiçbir yerde bulamıyorum. Bu "AppSettings" mi? – Si8

+1

@ Si8 'DynamicPolicyProviderFactory', diğer sınıflar gibidir ve herhangi bir kod klasöründe düzenlenebilir. 'MyApp.Poperties.Settings' için web.config dosyasındadır, ancak bu belirli bir bölümü düzenlemek için bir kullanıcı arayüzü istiyorsanız, projenizde VS> Özellikler> Ayarlar –

cevap

4

Uygulamada tracing'u etkinleştirin.

Bir hata görmelisiniz. Bunları yalnızca ilke için izin verilen üstbilgilere ekleyin ve her şey çalışmalıdır.