Ответ 1
Я добавил
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
а также
app.UseCors(CorsOptions.AllowAll);
на сервере. Это приводит к двум записям заголовка. Просто используйте последний, и он работает.
Я использую AngularJS $http на стороне клиента для доступа к конечной точке приложения ASP.NET Web API на стороне сервера. Поскольку клиент размещен в другом домене как сервер, мне нужен CORS. Он работает для $http.post(url, data). Но как только я аутентифицирую пользователя и делаю запрос через $http.get(url), я получаю сообщение
The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access.
Fiddler показывает мне, что в запросе запроса есть два записи заголовка после успешного запроса опций. Что и где я делаю что-то не так?
Обновление
Когда я использую jQuery $.get вместо $http.get, появляется такое же сообщение об ошибке. Так что это не проблема с AngularJS. Но где это неправильно?
Я добавил
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
а также
app.UseCors(CorsOptions.AllowAll);
на сервере. Это приводит к двум записям заголовка. Просто используйте последний, и он работает.
Мы столкнулись с этой проблемой, потому что мы создали CORS в соответствии с лучшей практикой (например, http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api) И ТАКЖЕ имел пользовательский заголовок <add name="Access-Control-Allow-Origin" value="*"/>
в сети. конфигурации.
Удалите запись web.config, и все будет хорошо.
В отличие от @mww ответ, мы все еще имеем EnableCors()
в WebApiConfig.cs AND a EnableCorsAttribute
на контроллере. Когда мы вытащили один или другой, мы столкнулись с другими проблемами.
Я использую Cors 5.1.0.0, после большой головной боли, я обнаружил, что проблема дублируется Access-Control-Allow-Origin и Access-Control-Allow-Header с сервера
Удалено config.EnableCors()
из файла WebApiConfig.cs и просто установите атрибут [EnableCors("*","*","*")]
в классе Controller
Подробнее о в этой статье.
У меня также были как OWIN, так и мой WebAPI, которые, по-видимому, нуждались в CORS, которые, в свою очередь, создавали ошибку 'Access-Control-Allow-Origin' header contains multiple values
.
Я закончил удаление ВСЕ кода, который включил CORS, а затем добавил следующее в system.webServer
node моего Web.Config:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
</customHeaders>
</httpProtocol>
Выполнение этих требований CORS для OWIN (разрешая вход в систему) и для WebAPI (разрешая вызовы API), но создало новую проблему: во время предпросмотра моих вызовов API не удалось найти метод OPTIONS
. Исправление для этого было простым - мне просто нужно было удалить следующее из handlers
node my Web.Config:
<remove name="OPTIONSVerbHandler" />
Надеюсь, это поможет кому-то.
На самом деле вы не можете установить несколько заголовков Access-Control-Allow-Origin
(или, по крайней мере, он не будет работать во всех браузерах). Вместо этого вы можете условно установить переменную среды, а затем использовать ее в директиве Header
:
SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
Итак, в этом примере заголовок ответа будет добавлен только в том случае, если заголовок запроса Origin
соответствует RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$
(в основном это означает localhost через HTTP или HTTPS и *.my.base.domain через HTTPS).
Не забудьте включить модуль setenvif
.
Docs:
BTW. }e
в %{ORIGIN_SUB_DOMAIN}e
не является опечаткой. Это как вы используете переменную среды в директиве Header
.
Сервер Apache:
Я трачу то же самое, но это было потому, что у меня не было никаких кавычек (") звездочки в моем файле, которые обеспечивали доступ к серверу, например '.htaccess.':
Header add Access-Control-Allow-Origin: *
Header add Access-Control-Allow-Origin "*"
У вас также может быть файл ".htaccess" в папке с другим ".htaccess", например
/
- .htaccess
- public_html / .htaccess (problem here)
В вашем случае вместо '*' звездочка будет сервером ip (http://127.0.0.1:9000
), на который вы даете разрешение на обслуживание данных.
ASP.NET:
Убедитесь, что в вашем коде отсутствует дубликат Access-Control-Allow-Origin.
Инструменты разработчика:
В Chrome вы можете проверить заголовки своих запросов. Нажмите клавишу F12 и перейдите на вкладку "Сеть", теперь запустите запрос AJAX и появится в списке, щелкните и укажите всю информацию.
Это происходит, если у вас есть опция Cors, настроенная в нескольких местах. В моем случае я имел это на уровне контроллера, а также в Startup.Auth.cs/ConfigureAuth.
Я понимаю, что если вы хотите, чтобы приложение было широко распространено, тогда просто настройте его в Startup.Auth.cs/ConfigureAuth как это... Вам понадобится ссылка на Microsoft.Owin.Cors
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
Если вы предпочитаете держать его на уровне контроллера, вы можете просто вставить его на уровне контроллера.
[EnableCors("http://localhost:24589", "*", "*")]
public class ProductsController : ApiController
{
ProductRepository _prodRepo;
если вы находитесь в IIS, вам нужно активировать CORS в web.config, тогда вам не нужно включать в App_Start/WebApiConfig.cs метод регистрации
Мое решение было, прокомментировали строки здесь:
// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);
и напишите в файле web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
просто возникла эта проблема с сервером nodejs.
вот как я его исправил.
Я запустил свой node сервер через nginx proxy
, и я установил nginx и node
на оба allow cross domain requests
, и мне это не понравилось, поэтому я удалил его из nginx и оставил его в node, и все было хорошо.
Это также может произойти, конечно, если вы действительно настроили заголовок Access-Control-Allow-Origin
иметь несколько значений. Например, список значений, разделенных запятыми, который поддерживается в RFC, но на самом деле не поддерживается по большинству основных браузеров. Обратите внимание, что в RFC говорится о том, как разрешить использование нескольких доменов без использования '*'.
Например, вы можете получить эту ошибку в Chrome, используя такой заголовок:
Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com
Это было в Chrome Version 64.0.3282.186 (Official Build) (64-bit)
Обратите внимание, что если вы рассматриваете это из-за CDN и используете Akamai, вы можете заметить, что Akamai не будет кэшировать на сервере, если вы используете Vary:Origin
, как многие предлагают решить эту проблему.
Вероятно, вам придется изменить способ создания ключа кэша с использованием поведения ответа "Изменение идентификатора кэша". Подробнее об этой проблеме в этом связанном вопросе StackOverflow
Я столкнулся с той же проблемой, и это то, что я сделал для ее устранения:
В службе WebApi внутри Global.asax я написал следующий код:
Sub Application_BeginRequest()
Dim currentRequest = HttpContext.Current.Request
Dim currentResponse = HttpContext.Current.Response
Dim currentOriginValue As String = String.Empty
Dim currentHostValue As String = String.Empty
Dim currentRequestOrigin = currentRequest.Headers("Origin")
Dim currentRequestHost = currentRequest.Headers("Host")
Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")
If currentRequestOrigin IsNot Nothing Then
currentOriginValue = currentRequestOrigin
End If
If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
currentResponse.Headers.Remove("Access-Control-Allow-Origin")
currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
End If
For Each key In Request.Headers.AllKeys
If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
currentResponse.StatusCode = 200
currentResponse.End()
End If
Next
End Sub
Здесь этот код позволяет только предполетному и токенному запросу добавить "Access-Control-Allow-Origin" в ответ, иначе я его не добавляю.
Вот мой блог о реализации: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6/
для тех, кто использует IIS с php, в IIS это обновление на стороне сервера. web.config запишите его корневой каталог (wwwroot) и добавьте это
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<directoryBrowse enabled="true" />
<httpProtocol>
<customHeaders>
<add name="Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
после этого перезапустите сервер IIS, введите IISReset в RUN и введите