2017-01-10 20 views
0

私はasp.net web apiアプリケーションを持っています。このアプリケーションは、xhr要求を別のWebサーバーの住人であるWeb APIバックエンドに送信します。ドメイン間の要求の問題については、Web APIのCORSオプションを有効にしました。指定したURLでうまく動作します。Asp.net Web APIのサブドメインに対するCORSポリシーの定義

[EnableCors(origins: @"http://sub.company.com", headers: "*", methods: "get,post")] 

それは私がs1.sub.company.comのように指定したサブドメインのサブドメインでは動作しません、sub.company.comから動作しますが、。そのサブドメインをポリシーに追加しましたが、再び機能しませんでした。

[EnableCors(origins: @"http://sub.company.com, http://s1.sub.company.com", headers: "*", methods: "get,post")] 

この問題を解決するにはどうすればよいですか?

答えて

0

これを行うカスタムCORSポリシーを作成できます。これにより、ルートドメインが同一である場合にクロスドメインアクセスが可能になります。

/// <summary> 
/// Cors policy provider that will allow cross-domain access if the request and the referrer has same root domain. 
/// This also support credential headers and cookies. 
/// See http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#enable-cors 
/// </summary> 
public class IdenticalRootDomainCorsPolicyProvider : ICorsPolicyProvider 
{ 
    private readonly string[] exposedHeaders; 

    /// <summary> Details information when a cross-domain fails. </summary> 
    public class CorsPolicyErrorDetails 
    { 
     /// <summary> The address from where request origins. </summary> 
     public Uri Referrer { get; set; } 

     /// <summary> The request URI. </summary> 
     public Uri Request { get; set; } 

     /// <summary> Specific message for the error. </summary> 
     public string Message { get; set; } 
    } 

    /// <summary> Occurs when cross-domain access was not accepted. </summary> 
    public event Action<CorsPolicyErrorDetails> CorsPolicyError; 

    /// <summary> Initializes a new instance of the <see cref="IdenticalRootDomainCorsPolicyProvider"/> class. </summary> 
    /// <param name="exposedHeaders"> Provide a list of header names that should be exposed. </param> 
    public IdenticalRootDomainCorsPolicyProvider(params string[] exposedHeaders) 
    { 
     this.exposedHeaders = exposedHeaders; 
    } 

    /// <summary> Gets the <see cref="T:System.Web.Cors.CorsPolicy" />. </summary> 
    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var origin = request.Headers.Where(x => x.Key == "Origin").Select(x => x.Value.FirstOrDefault()).FirstOrDefault(); 

     if (origin == null) 
     { 
      CorsPolicyError?.Invoke(new CorsPolicyErrorDetails { Message = "Could not find Origin in headers.", Request = request.RequestUri }); 
      return Task.FromResult((CorsPolicy)null); 
     } 

     var referrer = new Uri(origin); 
     var referrerRootDomain = referrer.GetRootDomain(); 
     var requestRootDomain = request.RequestUri.GetRootDomain(); 

     var policy = new CorsPolicy(); 
     policy.AllowAnyHeader = true; 
     policy.AllowAnyMethod = true; 
     policy.SupportsCredentials = true; 

     if (referrerRootDomain != requestRootDomain) 
     { 
      CorsPolicyError?.Invoke(new CorsPolicyErrorDetails { Referrer = referrer, Request = request.RequestUri }); 
      return Task.FromResult(policy); 
     } 

     // Standard ports which browser disregards should be handled (80, 443). 
     if (referrer.Port == 80 || referrer.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase)) 
      policy.Origins.Add($"{referrer.Scheme}://{referrer.DnsSafeHost}"); 
     else 
      policy.Origins.Add($"{referrer.Scheme}://{referrer.DnsSafeHost}:{referrer.Port}"); 

     // Add custom headers that should be exposed 
     foreach (var exposedHeader in exposedHeaders) 
     { 
      policy.ExposedHeaders.Add(exposedHeader); 
     } 

     return Task.FromResult(policy); 
    } 
} 

このようにそれを使用します。

var corsPolicyProvider = new IdenticalRootDomainCorsPolicyProvider(); 
corsPolicyProvider.CorsPolicyError += CorsPolicyProviderOnCorsPolicyError; 

configuration.EnableCors(corsPolicyProvider); 
関連する問題