Что я пытаюсь сделать
У меня есть внутренний веб-API ASP.Net Core, размещенный на бесплатном плане Azure (исходный код: https://github.com/killerrin/Portfolio-Backend ).
У меня также есть клиентский веб-сайт, который я хочу заставить использовать этот API. Клиентское приложение не будет размещаться в Azure, а будет размещено на страницах Github или в другой службе веб-хостинга, к которой у меня есть доступ. Из-за этого доменные имена не будут выстраиваться.
Глядя на это, мне нужно включить CORS на стороне Web API, однако я уже несколько часов пробовал все, и он отказывается работать.
Как у меня есть установка клиента Это просто простой клиент, написанный на React.js. Я вызываю API через AJAX в Jquery. Сайт React работает, поэтому я знаю, что это не так. Вызов API Jquery работает, как я подтвердил в Попытке 1. Вот как я делаю вызовы
var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
//alert(username + "|" + password + "|" + apiUrl);
$.ajax({
url: apiUrl,
type: "POST",
data: {
username: username,
password: password
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var authenticatedUser = JSON.parse(response);
//alert("Data Loaded: " + authenticatedUser);
if (onComplete != null) {
onComplete(authenticatedUser);
}
},
error: function (xhr, status, error) {
//alert(xhr.responseText);
if (onComplete != null) {
onComplete(xhr.responseText);
}
}
});
Что я пробовал
Попытка 1 - «правильный» путь
https://docs.microsoft.com/en-us/aspnet/core/security/cors
Я следовал этому руководству на веб-сайте Microsoft до T, пробуя все 3 варианта включения его в глобальном масштабе в Startup.cs, настраивая его на каждом контроллере и пробуя на каждом действии.
Следуя этому методу, кросс-домен работает, но только на одном действии на одном контроллере (POST для AccountController). Для всего остального Microsoft.AspNetCore.Cors
промежуточное ПО отказывается устанавливать заголовки.
Я установил Microsoft.AspNetCore.Cors
через NUGET и версия1.1.2
Вот как у меня это настроено в Startup.cs
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
});
...
...
...
}
// This method gets called by the runtime. Use this method to configure
//the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Enable Cors
app.UseCors("MyPolicy");
//app.UseMvcWithDefaultRoute();
app.UseMvc();
...
...
...
}
Как видите, я делаю все как было сказано. Я добавляю Cors перед MVC оба раза, и когда это не сработало, я попытался поставить [EnableCors("MyPolicy")]
каждый контроллер так
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
Попытка 2 - грубое принуждение
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
После нескольких часов попыток с предыдущей попыткой я решил, что я попытаюсь перебить его, пытаясь установить заголовки вручную, заставляя их запускаться при каждом ответе. Я сделал это после этого урока о том, как вручную добавлять заголовки к каждому ответу.
Это заголовки, которые я добавил
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
Это другие заголовки, которые я пробовал.
.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")
С помощью этого метода, кросс-сайт заголовки применяются правильно, и они отображаются в моей консоли разработчика и в Postman. Проблема, однако, заключается в том, что в то время как он проходит Access-Control-Allow-Origin
проверку, веб-браузер с шипением подходит (я полагаю), Access-Control-Allow-Headers
заявляя415 (Unsupported Media Type)
Так что метод грубой силы тоже не работает
в заключение
Кто-нибудь заставил это сработать и мог бы протянуть руку или просто указать мне правильное направление?
РЕДАКТИРОВАТЬ
Таким образом, чтобы выполнить вызовы API, мне пришлось прекратить использовать JQuery и переключиться на XMLHttpRequest
формат Pure Javascript .
Попытка 1
Мне удалось получить Microsoft.AspNetCore.Cors
на работу, следуя ответ MindingData, за исключением в Configure
методе поставив app.UseCors
перед тем app.UseMvc
.
Кроме того, в сочетании с Javascript API Solution options.AllowAnyOrigin()
поддержка групповых символов также начала работать.
Попытка 2
Таким образом, мне удалось заставить Попытку 2 (грубое принуждение) работать ... с единственным исключением, что Подстановочный знак Access-Control-Allow-Origin
не работает, и поэтому я должен вручную установить домены, которые имеют к нему доступ.
Это явно не идеально, так как я просто хочу, чтобы этот WebAPI был широко открыт для всех, но, по крайней мере, он работает для меня на отдельном сайте, что означает, что это начало
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddDefaultSecurePolicy()
.AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
.AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
источник
415 (Unsupported Media Type)
проблемы установитеContent-Type
заголовок запроса наapplication/json
.Ответы:
Поскольку у вас очень простая политика CORS (разрешить все запросы из домена XXX), вам не нужно усложнять ее. Сначала попробуйте выполнить следующее (очень простая реализация CORS).
Если вы еще этого не сделали, установите пакет CORS nuget.
В методе ConfigureServices вашего startup.cs добавьте службы CORS.
Затем в вашем методе Configure вашего startup.cs добавьте следующее:
Теперь попробуй. Политики предназначены для случаев, когда вам нужны разные политики для разных действий (например, разные хосты или разные заголовки). Для вашего простого примера вам это действительно не нужно. Начните с этого простого примера и настройте его по мере необходимости.
Дополнительное чтение: http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/
источник
app.UseCors
ПОСЛЕ `` app.UseMvc () `. Промежуточные программы выполняются в порядке их регистрацииoptions.DisableHttpsRequirement();
чтобы все это работало. Кажется, с настройками HTTPS Cors не применяются.В ConfigureServices добавьте
services.AddCors();
ДО службы .AddMvc ();Добавьте UseCors в Configure
Главное, что добавить
app.UseCors
, раньшеapp.UseMvc()
.Убедитесь, что вы объявили функциональность CORS перед MVC, чтобы промежуточное программное обеспечение сработало до того, как конвейер MVC получит управление и завершит запрос.
После того, как описанный выше метод работает, вы можете изменить его, настроить конкретный ORIGIN для приема вызовов API и не оставлять свой API открытым для всех
В методе configure скажите CORS использовать политику, которую вы только что создали:
Я только что нашел эту компактную статью на эту тему - https://dzone.com/articles/cors-in-net-core-net-core-security-part-vi
источник
Configure()
от порядка не очень важно здесь, внутриConfigureServices()
AllowCredentials()
с ,AllowAnyOrigin()
как и выше. Для использованияAllowCredentials()
нужно установитьWithOrigins()
. docs.microsoft.com/en-us/aspnet/core/security/…Я создал свой собственный класс промежуточного программного обеспечения, который работал для меня, я думаю, что-то не так с классом промежуточного программного обеспечения .net core
и использовал это таким образом в startup.cs
источник
if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
В моем случае только
get
запрос работает хорошо в соответствии с ответом MindingData. Для других типов запросов вам необходимо написать:Не забудьте добавить
.AllowAnyHeader()
источник
Для того, чтобы расширить свое присутствие на user8266077 «ы ответа , я обнаружил , что все еще нужен ответ OPTIONS питания для предполетных запросов в .NET 2.1 ядро-превью для моего случая использования:
а затем включил промежуточное ПО, как в Startup.cs
источник
app.Use<CorsMiddleware>();
await _next(context)
и установив код состояния и ответ вручную, если это произойдет. Мне также пришлось добавить «авторизацию» в Access-Control-Allow-Headers, чтобы предполетный запрос работал при отправке запросов от реакции, требующей авторизации.источник
Я боролся с этим в течение ДНЕЙ.
Я , наконец , получил его на работу, двигаясь
app.UseCors(CORS_POLICY);
в ТОП изConfigure()
.Также:
Microsoft.AspNetCore.Cors
раньше был обязательным пакетом NuGet в .Net Core 2 и ниже; теперь он автоматически становится частью Microsoft.AspNetCore в .Net Core 3 и выше.builder.AllowAnyOrigin()
и.AllowCredentials()
параметры CORS теперь взаимоисключающие в .Net Core 3 и вышеhttps
. URL-адрес http, похоже, выдавал ошибку CORS независимо от конфигурации CORS сервера .Net Core. Например,http://localhost:52774/api/Contacts
выдает ошибку CORS; просто изменив URL наhttps://localhost:44333/api/Contacts
работало.Дополнительное примечание :
источник
Ни одна из вышеперечисленных процедур не помогла, и я прочитал статью, в которой решил проблему.
Ниже приведен код.
и
и на вершине моего actionmethod
источник
app.UseCors()
)[EnableCors()]
в одном приложении. Вы должны использовать один или другой - но не оба: docs.microsoft.com/en-us/aspnet/core/security/… :Use the [EnableCors] attribute or middleware, not both in the same app.
попробуйте добавить
jQuery.support.cors = true;
перед вызовом AjaxТакже может случиться так, что данные, которые вы отправляете в API, будут ошибочными,
попробуйте добавить следующую функцию JSON
затем в ваших данных: объект изменить его на
источник
Самое простое решение - добавить
в Startup.cs.
источник
Я думаю , что если вы используете свой собственный CORS промежуточными вы должны убедиться , что это действительно Корс запроса, проверяя происхождение заголовка.
источник
Access-Control-Allow-Origin
заголовок не был выдан сервером. На самом деле я отправил запросы через Почтальон безOrigin
заголовка. Это спасло мой день! (Или, по крайней мере, до полудня;))Судя по вашему комментарию в ответе MindingData, он не имеет никакого отношения к вашему CORS, он работает нормально.
Ваше действие контроллера возвращает неверные данные. HttpCode 415 означает «Неподдерживаемый тип носителя». Это происходит, когда вы передаете неправильный формат контроллеру (то есть XML - контроллеру, который принимает только json), или когда вы возвращаете неправильный тип (возвращает Xml в контроллере, который объявлен как возвращающий только xml).
Для более поздней проверки проверьте наличие
[Produces("...")]
атрибута в вашем действии.источник
Для меня это не имеет ничего общего с кодом, который я использовал. Для Azure нам пришлось зайти в настройки службы приложений, в боковом меню пункт «CORS». Там мне пришлось добавить домен, с которого я запрашивал материал. Как только я это понял, все стало волшебным.
источник
В файле launchSettings.json в разделе iisSettings установите для anonymousAuthentication значение true:
Затем в Startup.cs в разделе ConfigureServices перед службами. AddMvc добавьте:
и затем, в методе configure, перед app.UseMvc () добавьте:
источник
Я использую .Net CORE 3.1, и я провел целую вечность, стуча головой об стену с этим, когда я понял, что мой код действительно начал работать, но моя среда отладки была нарушена, так что вот два совета, если вы пытаетесь устранить неполадки проблема:
Если вы пытаетесь регистрировать заголовки ответов, используя промежуточное ПО ASP.NET, заголовок «Access-Control-Allow-Origin» никогда не будет отображаться, даже если он там есть. Я не знаю, как, но, кажется, он был добавлен за пределы конвейера (в конце концов мне пришлось использовать wireshark, чтобы увидеть его).
.NET CORE не отправит «Access-Control-Allow-Origin» в ответе, если в вашем запросе нет заголовка «Origin». Почтальон не установит это автоматически, поэтому вам нужно добавить его самостоятельно.
источник
В моем случае я исправил с помощью UseCors перед UserRouting ..
источник
.NET Core 3.1
Работал для меня и как документы говорят, чтобы сделать это:
в классе запуска:
В методе ConfigureServices ():
В методе Configure ():
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1
источник
Я получил ответ MindingData выше, чтобы работать, но мне пришлось использовать Microsoft.AspNet.Cors вместо Microsoft.AspNetCore.Cors. Я использую проект API .NetCore Web Application в Visual Studio 2019
источник
позволит вам делать CORS со встроенными функциями, но он не обрабатывает запрос OPTIONS. Лучший обходной путь - создание нового Middleware, как было предложено в предыдущем посте. Проверьте ответ, помеченный как правильный в следующем сообщении:
Включить заголовок OPTIONS для CORS в .NET Core Web API
источник
Простой и легкий способ сделать это.
Install-Package Microsoft.AspNetCore.Cors
app.UseCors(options => options.AllowAnyOrigin());
источник
Вот мой код :)
источник
Вот как я это сделал.
Я вижу, что в некоторых ответах они устанавливают
app.UserCors("xxxPloicy")
и устанавливают[EnableCors("xxxPloicy")]
контроллеры. Вам не нужно делать оба.Вот шаги.
В Startup.cs внутри ConfigureServices добавьте следующий код.
Если вы хотите применить ко всему проекту, добавьте следующий код в метод Configure в Startup.cs
Или
Если вы хотите добавить его в определенные контроллеры, добавьте код включения Cors, как показано ниже.
Для получения дополнительной информации: см. Это
источник
Используйте пользовательский атрибут Action / Controller для установки заголовков CORS.
Пример:
Затем в Web API Controller / Action:
источник
Просто добавьте, чтобы ответить здесь, если вы используете
app.UseHttpsRedirection()
, и вы нажимаете не порт SSL, рассмотрите возможность комментирования этого.источник
Я использовал blazor webassembly в качестве клиента и ядро web-интерфейса asp.net в качестве бэкэнда, и у меня тоже была проблема cors.
Я нашел решение с этим кодом:
My ASP.Net core web api Startup.cs ConfigureServices и Configure методов первых строк выглядит следующим образом:
и мой метод Configure:
изменить
http://example.com
с вашим клиентским доменом или IP-адресомисточник
источник