首页 > 解决方案 > 在 web.config (IIS) 中为非 .NET 应用程序设置 CORS

问题描述

我正在尝试使用 IIS CORS 模块(https://www.iis.net/downloads/microsoft/iis-cors-module)在站点上允许 CORS,但我遇到了麻烦。

这是我的 web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="https://my.site" allowCredentials="false" maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true"></allowHeaders>
                <allowMethods>
                     <add method="GET" />
                     <add method="POST" />
                     <add method="PUT" />
                </allowMethods>
            </add>
        </cors>
    </system.webServer>
</configuration>

使用此设置,OPTIONS(飞行前)请求工作正常,但任何进一步的请求(GET,POST)由于缺少Access-Control-Allow-Origin而引发浏览器异常 我尝试将以下内容添加到 web.config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="https:/my.site" />
  </customHeaders>
</httpProtocol>

但是以这种方式, OPTIONS 失败了,因为有 2 个Access-Control-Allow-Origin实例

仅使用自定义标头,预检失败并显示代码 500(我认为 IIS 不支持没有 CORS 模块的 OPTIONS 方法)。

IIS CORS 模块文档很差,谷歌搜索我只能找到与 .NET 代码相关的信息,但这不是我的情况。我无法修改代码(而且它不是 .NET),我需要对 IIS 采取行动。

如何使 IIS 正确响应 CORS 请求?

标签: iiscorsweb-config

解决方案


从您发布的代码来看,您似乎没有正确添加您的来源。原始行应包含(完全限定域名)FQDN或与其匹配的一些正则表达式。

正确的行如下所示:

<add origin="https://my.site.com" allowCredentials="false" maxAge="120"> 

您可以使用以下方式允许您的域的子域:

<add origin="https://*.site.com" allowCredentials="false" maxAge="120">

从它的声音来看,您没有收到您想要从 Web 服务器返回的标头。这可能是由于网络服务器只返回 CORS 安全标头

使用 Microsoft 的IIS CORS 博客,我在配置中添加了将在请求中公开标头的内容。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="https://my.site" allowCredentials="false" maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="DNT" />
                    <add header="Host" />
                    <add header="Origin" />
                    <add header="Referrer" />
                    <add header="User-Agent" />
                </allowHeaders>
                <allowMethods>
                     <add method="GET" />
                     <add method="POST" />
                     <add method="PUT" />
                </allowMethods>
                <exposeHeaders>
                    <add header="DNT" />
                    <add header="Host" />
                    <add header="Origin" />
                    <add header="Referrer" />
                    <add header="User-Agent" />
                </exposeHeaders>
            </add>
        </cors>
    </system.webServer>
</configuration>

但是,根据此 CORS 文档OPTIONS 请求不会将 Allow Headers 或 Expose Headers 配置应用于它们。希望这不是这里的问题。


下面我添加了我能想到的最基本的 CORS 请求。如果此请求有效,则可能是您遇到的客户端问题。

fetch('example.com', {
    method: 'GET',
    mode: 'cors',
    credentials: 'include',
    headers: { 'Authorization': authString }
}).then(
    response => response.json()
); // parses JSON response into native JavaScript objects

推荐阅读