2017-01-01 167 views
2

我有一個ASP.NET Web API 2服務。多個客戶端(角度)應用程序會與該服務進行交談。該應用程序和服務都發表了不同的子域,如下所示:CORS瀏覽器後退按鈕錯誤

service.mydomain.com

app1.mydomain.com

app2.mydomain.com

我用Microsoft.AspNet.WebApi.Cors - NuGet包啓用CORS,它做工精細,除了一個場景: 當用戶打開一個應用程序(app1.mydomain.com)時。 然後導航到另一個(app2.mydomain.com)。然後按下瀏覽器後退按鈕。所述follwoing CORS錯誤:

The 'Access-Control-Allow-Origin' header has a value 'http://app2.mydomain.com' that is not equal to the supplied origin. 
Origin 'http://app1.mydomain.com' is therefore not allowed access 

我配置Microsoft.AspNet.WebApi.Cors - NuGet包,如下所示:

public static void Register(HttpConfiguration config) 
     { 
     var cors = new EnableCorsAttribute(
       //to-do allow cross domains for all maarif.com sites 
       origins: "*", //and also tried "http://app1.mydomain.com, http://app2.mydomain.com" gives same result 
       headers: "*", 
       methods: "*") {SupportsCredentials = true}; 

      config.EnableCors(cors); 
     } 

我跟蹤服務器上的Origin標頭的值。 我把下面的代碼在服務「的Global.asax」:

protected void Application_BeginRequest() 
     { 
      var origin = HttpContext.Current.Request.Headers["Origin"]; 

      if (origin != null) 
      { 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin); 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "*"); 
       HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
      } 
     } 

當用戶單擊後退按鈕形式「app2.mydomain.com」到「app1.mydomain.com」的問題發生,原產地發送請求是'app2.mydomain.com',那裏是服務允許訪問的內容:HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", 'app2.mydomain.com');

任何解決方法?

請注意,我不能放'*',因爲請求已通過身份驗證。

回答

0

你試圖把你的文件StratUp.cs類似:

var corsPolicy = new CorsPolicy 
      { 
       AllowAnyMethod = true, 
       AllowAnyHeader = true, 
       SupportsCredentials = true, 
       Origins = { "http://site1.example.com", "http://site2.emaple.com.:38091", "http://localhost:39372" } 

      }; 

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

而且在你的web.config在你的網絡服務器部分,也許是這樣的:

<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
+0

其實我使用, Web Api項目使用'global.asax'文件而不是'StratUp.cs' 我試圖HttpContext.Current.Response.AddHeader(「Access-Control-Allow-Origin」,「app1.mydomain.com,app2.mydomain。 COM「); – yass

+0

好吧,你更喜歡...但你有沒有試過像我向你建議的? ..它工作嗎? –

+0

我這樣說:HttpContext.Current.Response.AddHeader(「Access-Control-Allow -Origin」,「app1.mydomain.com,app2.mydomain.com」);但它不工作,它不接受標題值中的多個域,錯誤表示它必須是單個域 – yass