IIS 8.5 Not honoring Web API [EnableCors] attribute. Not setting Access-Control-Allow-Origin Header
Asked Answered
F

0

7

Rundown

So I've continued tinkering with this. This is a new Windows Server with IIS 8.5. I've never had any problems getting CORS to "just work" in IIS so I've never really needed to care about the fiddly bits in the server config. The immediate fix was the shotgun approach; I enabled CORS server-wide with the following modification to applicationhost.config

   <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>

but removing this customHeader and setting [EnableCors(origins: "*",headers: "*", methods: "*")] inside my controllers does not cause the server to send back Access-Control-Allow-Origin response headers (yes, I made sure to call config.EnableCors() in my HttpConfiguration.

An additional complication is that using this method, I have to allow all origins because I need several origins to be able to access this server. Browser implementations do not permit multiple origins to be sent back from the server in this header. I could always write my own EnableCors logic within my application, but would rather understand and fix the server config to stay on the res.


Original Question

So I'm running into a bit of an issue trying to get a Web Application deployed to IIS 8.5 on a fresh Windows Server 2012 R2 straight from our server provisioning team. My application is a Web API with Cors Enabled, (currently allowing all origins) but the server is not returning an Access-Control-Allow-Origin header to calling clients. I've never had an issue with Web API Cors "just working."

I found this resource, but confirmed that the OPTIONSVerbHandler had already been removed within my application's web.config.

I tried to add a customHeader to IIS, but whenever I did that, the server started returning 500s.

Is there anything that I can do to force IIS 8.5 to send Access-Control-Allow-Origin headers from ASP.NET?


Edit1

So I apparently installed the ASP.NET Cross Origin Resource Sharing NuGet package into my solution rather than the ASP.NET Web API 2.2 Cross Origin Resource Sharing NuGet package. I swapped these out and I have limited (but still unexpected) CORS functionality. I'll describe the weirdness I'm experiencing now.

So before I realized I had the wrong NuGet package, I had gone into applicationHost.config and added

<customHeaders>
   <add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>

in an attempt to get the server to push the header back manually. Without the NuGet update, this did not set the header on preflight responses but at this point I'm not quite sure if that was due to me forgetting an iisreset;I was trying to move fast.

At any rate, when I added the Web API 2.2 Cors NuGet package, my server responses started emitting an Access-Control-Allow-Origin header with wildcard origins rather than the ones that I had set in my EnableCors attributes inside my Web API routes. So with that value, I knew that it was the configured customHeader rather than the EnableCorsAttribute that is now controlling the value.

(Here's where the weirdness comes in) So I would actually prefer to be able to directly control the CORS whitelist directly at the server level, so I went ahead and set the customHeader to

<customHeaders>
   <add name="Access-Control-Allow-Origin" value="http://segment.mydomain.com" />
</customHeaders>

where http://segment.mydomain.com also matches one of the allowed origins inside my API routes.

I now get the proper Access-Control-Allow-Origin sent back from IIS in the PreFlight request, but the subsequent POST returns a 500. If I remove the EnableCors attribute from my Api Route, the POST succeeds (confirmed by directly querying the database that persists the posted data)

...wt*?


Edit2

So that hopeful approach (statically defined origins inside a customHeader in IIS rather than allowing developers to list their origins directly inside controllers) won't actually work. I need to whitelist multiple origins and Chrome's implementation only allows one origin to be set in the ACAO header. It also will not allow wildcard segments in origins, so...that sucks.

Fourth answered 13/2, 2015 at 16:54 Comment(3)
wait...I think I might have found the problem 30 seconds after postingFourth
So, I hadn't realized that when I was setting up my project dependencies I accidentally added the "ASP.NET Cors" NuGet package installed instead of "ASP.NET Web API 2.2 Cors" NuGet package. Switching these out allowed the Access-Control-Allow-Origin header to send, but only because that module apparently caused IIS to honor the customHeader config that I had explicitly added. Whenever I removed the customHeader, CORS broke again. I'll write a response to go further into the scenarioFourth
Note that installing the Web API 2.2 Cors NuGet package did not correct the issue.Fourth

© 2022 - 2024 — McMap. All rights reserved.