CORS выдает ошибку, когда я подключаюсь к нему из внешней программы

У меня проблема с запросом к моему API из моей программы на C#, это дает мне ошибку CORS (из Интернета это работает, потому что мой локальный IP-адрес находится в белом списке, но из программы это дает мне ошибку запроса cors).

API создан в Express.

Мои коры:

const dominiosPermitidos = [url];
const corsOptions = {
    origin: function(origin, callback) {
        console.info(origin);
        
        if (dominiosPermitidos.indexOf(origin) !== -1) {
            //El origen del request esta permitido
            callback(null, true);
        } else {
            callback(new Error('No permitido por Cors'))
        }
    }
}    

app.use(cors(corsOptions));

Вызов в С#:

url = "127.0.0.1/api/datos";
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url);

HttpWebResponse myHttpWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
Stream myStream = myHttpWebResponse.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myStream);
//Leemos los datos
string Datos = HttpUtility.HtmlDecode(myStreamReader.ReadToEnd());

dynamic data = JsonConvert.DeserializeObject(Datos);

return data;

Ошибка С# ошибка

Ошибка API ошибка

Должен ли я деактивировать Cors?

Спасибо

Я попытался поместить свой локальный IP-адрес в белый список, но когда я вызываю API из своей программы на C#, CORS выдает мне ошибку

В чем ошибка?

lets do it 11.11.2022 18:32

Я только что обновил вопрос и прикрепил 2 картинки с ошибками в C# и NodeJS. @вивекнуна

Sergio Rex 11.11.2022 19:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша программа на С#, похоже, не отправляет источник, и это нормально, поскольку это не браузер. Но поскольку ваш сервер настроен на раннюю ошибку, если CORS собирается заблокировать ответ от достижения браузера, вы получаете от него ошибку (которую вы обычно не смогли бы прочитать, если бы она была из браузера).

Если вы посмотрите на https://www.npmjs.com/package/cors в разделе «Настройка CORS с динамическим источником», вы увидите, что во втором примере они поставили « || !origin» по этой самой причине, поэтому сервер продолжает обрабатывать его, если он с сервера. Таким образом, вы должны иметь возможность просто изменить код сервера Node.js следующим образом:

const dominiosPermitidos = [url];
const corsOptions = {
    origin: function(origin, callback) {
        console.info(origin);
        
        if (dominiosPermitidos.indexOf(origin) !== -1 || (! origin)) {
            //El origen del request esta permitido
            callback(null, true);
        } else {
            callback(new Error('No permitido por Cors'))
        }
    }
}    

app.use(cors(corsOptions));

Вам также может быть полезно: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

Надеюсь это поможет.

Редактировать: поскольку я не могу писать комментарии, мне придется сделать это здесь. Вы можете отключить CORS на сервере, но это будет означать, что ваш веб-сайт в другом источнике не сможет отправлять запросы. Но я мог неправильно понять, и вы никогда не будете отправлять запросы к API из браузера, и в этом случае вы можете просто удалить всю логику CORS.

Большое спасибо, вы решили мою проблему полностью, но у меня есть вопрос, если я поставлю !origin, может ли это быть ошибкой безопасности?

Sergio Rex 11.11.2022 20:00

Нет, было бы совершенно безопасно не иметь на сервере никаких проверок или логики, связанных с CORS. Проблема в том, что вам нужно иметь немного логики, если вы хотите, чтобы браузер мог взаимодействовать с сервером (если только сервер не размещает текущую страницу, что упрощает ситуацию). Если вам интересно, я бы посоветовал взглянуть на ссылку mdn, но я дам краткое объяснение того, что делает CORS... Скажем, вы используете свой браузер для посещения evil.com, вы не Не хочу, чтобы он мог делать запросы к bank.com и выдавать себя за вас. Таким образом, браузеры будут останавливать запросы, если это не разрешено bank.com.

Nico 11.11.2022 20:08

Но серверы не имеют этого ограничения, поскольку они имеют больший контроль над тем, какие файлы cookie они отправляют, и вы все равно сможете обойти их все, поскольку они не работают в браузере, поэтому у них больше привилегий. Ранняя ошибка не повышает безопасность, так как любой может легко обойти ее, если захочет, это просто для того, чтобы сервер не утруждал себя обработкой запроса, который клиент никогда не увидит. Если вы хотите ограничить, кто может получить доступ к этому API, у вас будет система ключей API в дополнение к правильно настроенному CORS (т. е. не просто разрешение каждого источника).

Nico 11.11.2022 20:12

Другие вопросы по теме

Npx patch-package создает огромный патч с «Автоматически сгенерированным файлом. раздел НЕ ИЗМЕНЯТЬ
Инструмент командной строки, он всегда дает сбой «dyld: сбой привязки отложенного символа: символ не найден: ____chkstk_darwin»
Как доставить голосовую почту в ящик голосовой почты пользователя с помощью Twilio?
Net::ERR_FAILED вызов API для бэкэнда из nextjs с докером nginx
Создайте массив объектов, сопоставив и объединив два массива объектов
Ошибка HTTP-сервера Hapi | узелJS | UnhandledPromiseRejectionWarning: TypeError: PerfHooks.performance.eventLoopUtilization не является функцией
Как использовать Express и GRPC в одном и том же сервисе в Google Cloud Run без конфликта портов
Невозможно получить доступ к приложению Node через обратный прокси-сервер с помощью Nginx в контейнерах Docker
Невозможно собрать приложение с помощью электронного построителя. Ошибка: ошибка gyp с кодом выхода: 1
Как избежать сборки SAM при установке devDependencies