**已关闭。**此问题需要debugging details。它目前不接受回答。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
5天前关闭。
Improve this question的
我用C#编写了API控制器,它托管在IIS中。Access-Control-Allow-Origin在此控制器的IIS的响应Http标头中设置。CORS也在代码中启用。当我在请求头中添加Origin键后使用Postman测试API时,我得到了500 Internal Server错误,并且在响应头中有两个Access-Control-Allow-Origin
键,第一个在POSTMAN中的Origin键中提到了值,第二个在服务器端提到了值。如果我没有在请求头中使用Origin键,则API工作正常。
我尝试使用web.config和删除Access-Control-Allow-Origin来实现,但响应相同。在服务器端添加Access-Control-Allow-Origin中未提及的源密钥后,响应应类似于未授权,并且在POSTMAN中响应头的Access-Control-Allow-Origin中不应存在origin中传递的值。
1条答案
按热度按时间z18hc3ub1#
有两种标准方法来设置对CORS的支持。
静态,其中服务器 * 总是 * 发送相同的
Access-Control-Allow-*
头(无论请求的任何内容)。这通常用于您想要使用通配符(
Access-Control-Allow-Origin: *
)来使网站上的客户端代码可以访问API的情况,或者您只需要提供单个源(例如,Access-Control-Allow-Origin: http://example.com
(对于api.example.com
)。它具有配置简单的优点。
动态,其中服务器注意请求中的
Origin
头部,然后 * 可选地 * 添加Access-Control-Allow-Origin: $valueOfThatRequestHeader
,如果源在允许的源列表中。当您需要支持多个来源而不是每个来源时,就需要这种方法。
我得到500内部服务器错误和有两个访问控制允许起源关键字在响应头,第一个有值中提到的起源关键字在POSTMAN和第二个有值中提到的服务器端。
出现此问题的原因似乎是您试图使用IIS配置为
Access-Control-Allow-Origin
实现静态值**,并使用ASP.NET的Web配置**实现动态值。选择一个(基于我之前对两种方法的描述)。
在服务器端添加Access-Control-Allow-Origin中未提及的源密钥后,响应应类似于Unauthorized
虽然服务器端代码可能会注意Origin头,并在它不在允许列表中时发出
401 Unauthorized
响应状态,但这样做是非常不典型的。如果
Access-Control-Allow-Origin
响应头与源不匹配,则浏览器将拒绝JS访问数据。请求可能试图在服务器上进行更改(例如但是任何这样的请求都应该触发规则,使其成为preflighted,这样你就只能得到preflight OPTIONS请求(然后缺少匹配的
Access-Control-Allow-Origin
响应头将导致浏览器阻止POST / PUT / etc请求)。如果请求不是来自浏览器,那么Origin头很容易被伪造,所以使用一个authn是无用的。
**不要期望不匹配的Origin会触发401。不要浪费精力试图让它触发一个。