Ошибка предварительного запроса CORS на. Net Базовый API, работающий локально на IIS Express - PullRequest
1 голос
/ 20 марта 2020

Мы разрабатываем приложение, используя. Net Core (3.1.1) API и интерфейс реагирования. Приложение использует Windows Аутентификация. Мы используем API-интерфейс, зависящий от IIS. Изначально у нас были проблемы с CORS, но все работало над IIS на сервере, установив модуль CORS и выполнив преобразование в файл web.config при развертывании. Мы также получили базовый c CORS, работающий на IIS Express, добавив раздел <customheaders> в файл applicationhost.config для Visual Studio. Однако мы застряли на предварительных запросах на действия PUT и DELETE при локальном запуске в IIS Express.

Вот мой файл lauchSettings. json file:

{
  "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"
    }
  }

Вот раздел CORS нашего файла applicationhost.config:

     <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>

Как я уже сказал, это прекрасно работает для 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.

Я попытался установить модуль CORS локально (что устранило проблему на сервере с IIS), но для его работы требуется механизм IIS 7 или более поздней версии. Я думаю, что основная проблема c заключается в том, что предварительный запрос отправляется анонимно, и у нас отключена анонимная аутентификация, поэтому мы можем использовать Windows Аутентификацию - но если не считать переписывания приложения для обработки CORS и аутентификации в приложении вместо позволяя IIS справиться с этим - есть ли у меня какой-либо вариант для IIS Express?

Вот некоторые ресурсы, которые я использовал для этого: https://davidsekar.com/asp-net/cors-development-in-localhost, https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-3.1&tabs=visual-studio , https://blogs.iis.net/iisteam/introducing-iis-cors-1-0, http://blog.jonathanchannon.com/2013/09/16/enabling-cors-in-iisexpress/,

ОБНОВЛЕНИЕ

Возможно, я решил это, добавив следующее к файлу applicationhost. json в разделе system.WebServer:

<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>

Это просто возвращает пользовательский ответ 200 на все запросы OPTIONS. Не было бы идеально для производства, но так как это только для локального запуска IIS Express, все должно быть в порядке. Я опубликую еще одно обновление после дополнительного тестирования, чтобы подтвердить.

ОБНОВЛЕНИЕ 2 Это на самом деле исправило проблему. Надеюсь, это поможет спасти кого-то еще ...

...