Mam prostą metodę działania, która zwraca trochę JSON. Działa na ajax.example.com. Potrzebuję uzyskać dostęp do tego z innej witryny someothersite.com.
Jeśli spróbuję to nazwać, otrzymuję oczekiwane ...:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
Znam dwa sposoby obejścia tego: JSONP i utworzenie niestandardowego HttpHandler w celu ustawienia nagłówka.
Czy nie ma prostszego sposobu?
Czy nie jest możliwe proste działanie, aby zdefiniować listę dozwolonych źródeł - lub po prostu zezwolić wszystkim? Może filtr akcji?
Optymalne byłoby ...:
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
json
asp.net-mvc-3
cors
asp.net-ajax
Kjensen
źródło
źródło
Odpowiedzi:
Dla zwykłych kontrolerów ASP.NET MVC
Utwórz nowy atrybut
Oznacz swoją akcję:
Dla interfejsu API sieci Web ASP.NET
Oznacz cały kontroler API:
Lub indywidualne wywołania API:
Dla Internet Explorera <= v9
IE <= 9 nie obsługuje CORS. Napisałem javascript, który automatycznie przekieruje te żądania przez serwer proxy. Wszystko jest w 100% przejrzyste (wystarczy podać mój serwer proxy i skrypt).
Pobierz go za pomocą nugetu
corsproxy
i postępuj zgodnie z dołączonymi instrukcjami.Wpis na blogu | Kod źródłowy
źródło
Jeśli używasz IIS 7+, możesz umieścić plik web.config w katalogu głównym folderu, korzystając z tego w sekcji system.webServer:
Zobacz: http://msdn.microsoft.com/en-us/library/ms178685.aspx I: http://enable-cors.org/#how-iis7
źródło
Natknąłem się na problem polegający na tym, że przeglądarka odmówiła podania treści, którą pobrała, gdy żądanie przeszło w plikach cookie (np. Xhr miał swoją
withCredentials=true
), a witryna zostałaAccess-Control-Allow-Origin
ustawiona*
. (Błąd w Chrome brzmiał: „Nie można użyć symboli wieloznacznych w Access-Control-Allow-Origin, gdy flaga poświadczeń jest prawdziwa”).Opierając się na odpowiedzi z @jgauffin, stworzyłem to, co jest w zasadzie sposobem obejścia tego konkretnego sprawdzenia bezpieczeństwa przeglądarki, więc zastrzegaj emptor.
źródło
To jest naprawdę proste, po prostu dodaj to w web.config
W Origin umieść wszystkie domeny, które mają dostęp do twojego serwera WWW, w nagłówkach umieść wszystkie możliwe nagłówki, których może użyć każde żądanie HTTP w ajax, w metodach umieść wszystkie metody, na które zezwolisz na serwerze
pozdrowienia :)
źródło
Czasami OPCJE czasownik również powoduje problemy
Po prostu: zaktualizuj plik web.config za pomocą następujących elementów
I zaktualizuj nagłówki usługi internetowej / kontrolera za pomocą httpGet i httpOptions
źródło
WebAPI 2 ma teraz pakiet dla CORS, który można zainstalować za pomocą: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic
Po zainstalowaniu postępuj zgodnie z kodem: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
źródło
Dodaj ten wiersz do metody, jeśli używasz interfejsu API.
źródło
Ten samouczek jest bardzo przydatny. Aby podać krótkie podsumowanie:
Skorzystaj z pakietu CORS dostępnego w Nuget:
Install-Package Microsoft.AspNet.WebApi.Cors
W swoim
WebApiConfig.cs
pliku dodajconfig.EnableCors()
doRegister()
metody.Dodaj atrybut do kontrolerów, których potrzebujesz do obsługi corsów:
[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]
źródło
źródło
Innym sposobem jest dodanie kodu jak poniżej w pliku webApiconfig.cs.
config.EnableCors (nowe EnableCorsAttribute („ ”, nagłówki: „ ”, metody: „*”, odsłonięte nagłówki: „TestHeaderToExpose”) {SupportsCredentials = true});
Lub możemy dodać poniższy kod w pliku Global.Asax.
Napisałem to dla opcji. Proszę zmodyfikować to samo, jak na swoje potrzeby.
Happy Coding !!
źródło
Po całym zmaganiu przez cały wieczór w końcu udało mi się to uruchomić. Po pewnym debugowaniu odkryłem, że problem, w który wchodzę, polegał na tym, że mój klient wysyłał tak zwane żądanie opcji inspekcji wstępnej, aby sprawdzić, czy aplikacja może wysłać żądanie postu z podaniem źródła, metod i nagłówków. Nie chciałem używać Owina ani kontrolera APIC, więc zacząłem kopać i wymyśliłem następujące rozwiązanie z tylko ActionFilterAttribute. Szczególnie ważna jest część „Kontrola dostępu - Zezwalaj na nagłówki”, ponieważ wspomniane tam nagłówki muszą pasować do nagłówków, które wyśle twoje zapytanie.
Wreszcie moja metoda akcji MVC wygląda następująco. Ważne jest również wspomnienie o Opcjach HttpVerbs, ponieważ w przeciwnym razie żądanie inspekcji wstępnej zakończy się niepowodzeniem.
źródło
W Web.config wprowadź następujące dane
źródło
Jeśli używasz IIS, sugeruję wypróbowanie modułu CORS IIS .
Jest łatwy w konfiguracji i działa na wszystkich typach kontrolerów.
Oto przykład konfiguracji:
źródło
Używam DotNet Core MVC i po kilku godzinach walki z pakietami nuget, Startup.cs, atrybutami i tym miejscem, po prostu dodałem to do akcji MVC:
Zdaję sobie sprawę, że jest to dość niezręczne, ale to wszystko, czego potrzebowałem i nic więcej nie chciałem dodawać tych nagłówków. Mam nadzieję, że to pomaga komuś innemu!
źródło