2017-01-01 168 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