Мы разрабатываем приложение, используя. 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 Это на самом деле исправило проблему. Надеюсь, это поможет спасти кого-то еще ...