在 IIS Express 上本地运行的 .Net Core API 上的 CORS 预检请求问题

Log*_*nde 5 cors iis-express .net-core

我们正在使用 .Net Core (3.1.1) API 和 React 前端开发一个应用程序。该应用程序使用 Windows 身份验证。我们正在运行依赖于 IIS 的 API 框架。我们最初遇到了 CORS 问题,但通过安装 CORS 模块并在部署时对 web.config 进行转换,让服务器上的 IIS 一切正常。<customheaders>通过向 Visual Studio 的 applicationhost.config 文件添加一个部分,我们还可以在 IIS Express 上运行基本的 CORS 。然而,当在 IIS Express 上本地运行时,我们陷入了 PUT 和 DELETE 操作的预检请求上。

这是我的 lauchSettings.json 文件:

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:xxxxx",
      "sslPort": xxxxx
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "API": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:xxxxx;https://localhost:xxxxx"
    }
  }
Run Code Online (Sandbox Code Playgroud)

这是 applicationhost.config 文件的 CORS 部分:

     <customHeaders>
        <clear />
        <add name="X-Powered-By" value="ASP.NET" />
        <remove name="Access-Control-Allow-Origin" />
        <add name="access-control-allow-origin" value="http://localhost:3000" />
        <add name="access-control-allow-headers" value="*" />
        <add name="access-control-allow-credentials" value="true" />
        <add name="access-control-allow-methods" value="get, post, put, delete, options" />
        <add name="access-control-max-age" value="600" />
      </customHeaders>
Run Code Online (Sandbox Code Playgroud)

正如我所说,这对于 GET 和 POST 非常有用,但对于 PUT 或 DELETE 不起作用。我们得到错误:

Access to fetch at 'https://localhost:xxxx/api/blah/blahblah' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Run Code Online (Sandbox Code Playgroud)

我尝试在本地安装 CORS 模块(这解决了使用 IIS 的服务器上的问题),但它需要 IIS 7 引擎或更高版本才能运行。我认为基本问题是预检请求是匿名发送的,并且我们禁用了匿名身份验证,因此我们可以使用 Windows 身份验证 - 但缺少重写应用程序来处理应用程序中的 CORS 和身份验证,而不是让 IIS 处理它 -我有 IIS Express 的选项吗?

以下是我到目前为止使用的一些资源: https: //davidsekar.com/asp-net/cors-development-in-localhost、https : //learn.microsoft.com/en-us/aspnet/core/ security/authentication/windowsauth?view=aspnetcore-3.1&tabs=visual-studiohttps://blogs.iis.net/iisteam/introducing-iis-cors-1-0, http: //blog.jonathanchannon.com/2013 /09/16/启用-cors-in-iisexpress/ ,

更新

我可能通过将以下内容添加到该system.WebServer部分的 applicationhost.json 文件中来解决这个问题:

<rewrite>
            <globalRules>
                <rule name="Preflight" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <conditions>
                        <add input="{REQUEST_METHOD}" pattern="OPTIONS" />
                    </conditions>
                    <action type="CustomResponse" statusCode="200" statusReason="Preflight" statusDescription="Preflight" />
                </rule>
            </globalRules>
        </rewrite>
Run Code Online (Sandbox Code Playgroud)

这基本上只是返回对所有 OPTIONS 请求的自定义 200 响应。对于生产来说并不理想,但由于这只是为了在本地运行 IIS Express,所以应该没问题。经过更多测试确认后,我将发布另一个更新。

更新 2 事实上,这确实纠正了问题。希望这有助于节省其他人的时间......