'Access-Control-Allow-Origin' başlığı birden çok değer içeriyor


104

Sunucu tarafında bir ASP.NET Web API uygulamasının uç noktasına erişmek için istemci tarafında AngularJS $ http kullanıyorum. İstemci, sunucu olarak farklı bir etki alanında barındırıldığı için CORS'a ihtiyacım var. $ Http.post (url, data) için çalışır. Ancak kullanıcının kimliğini doğrulayıp $ http.get (url) üzerinden bir istekte bulunduğum anda mesajı alıyorum

'Access-Control-Allow-Origin' başlığı birden çok 'http://127.0.0.1:9000, http://127.0.0.1:9000' değeri içerir, ancak yalnızca birine izin verilir. Bu nedenle 'http://127.0.0.1:9000' kaynağına erişime izin verilmiyor.

Fiddler, başarılı bir seçenek isteğinden sonra alma isteğinde gerçekten iki başlık girişi olduğunu gösteriyor. Neyi ve nerede yanlış bir şey yapıyorum?

Güncelleme

$ Http.get yerine jQuery $ .get kullandığımda aynı hata mesajı çıkıyor. Yani bu, AngularJS ile sorun değil gibi görünüyor. Ama nerede yanlış?


Peki başlık ne içeriyor?
eckes

Yanıtlar:


53

ekledim

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

Hem de

app.UseCors(CorsOptions.AllowAll);

sunucuda. Bu, iki başlık girişi ile sonuçlanır. Sadece ikincisini kullanın ve işe yarıyor.


4
Bir ayarlar dosyasından Properties.Settings.Default.Cors okuyormuşsunuz gibi görünüyor. Bir örnek gönderebilir misin? Ve UseCors hangi sınıftadır?
Hoppe

"Yakalanmamış ReferenceError: EnableCorsAttribute tanımlı değil" ??
devre

@Hoppe, lütfen msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx adresine bir göz atın . EnableCorsAttribute'un ilk parametresinin izin verilen kaynaklar olduğunu açıklar. Örneğin hepsine izin vermek için "*".
Papa Mufflon

1
@Hoppe, UseCors NuGet paketi Microsoft.Owin.Cors içinde tanımlanan bir uzantı yöntemidir. Sf katanaproject.codeplex.com/SourceControl/latest#src/… .
Papa Mufflon

7
config.EnableCors (enableCorsAttribute) genellikle WebApiConfig.cs'de çağrılır - kullanımı burada açıklanan Microsoft.AspNet.WebApi.Cors Nuget paketinin parçasıdır: asp.net/web-api/overview/security/… uygulaması .UseCors (CorsOptions.AllowAll) genellikle kimlik sağlayıcınızı (ör. OAuth) yapılandırmanın bir parçası olarak Startup.Auth.cs'de çağrılır ve Microsoft.Owin.Cors Nuget paketinin bir parçasıdır.
Henry C

51

Bu sorunla karşılaştık çünkü CORS'u en iyi uygulamaya göre (ör. Http://www.asp.net/web-api/overview/security/enoking-cross-origin-requests-in-web-api ) VE AYRICA özel bir başlığa sahipti<add name="Access-Control-Allow-Origin" value="*"/> web.config dosyasında .

Web.config girişini kaldırın ve her şey yolunda.

@ Mww'nin cevabının aksine, hala EnableCors()WebApiConfig.cs'de VE EnableCorsAttributedenetleyicide bir tane var. Birini veya diğerini çıkardığımızda, başka sorunlarla karşılaştık.


11
Bu <add name = "Access-Control-Allow-Origin" value = "*" /> satırını kaldırdım ve web.config dosyasında kaldırmadığım diğer iki girdiye sahiptim: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Access-Control-Allow-Methods "value =" GET, POST, PUT, DELETE, OPTIONS "/>
Siva Karthikeyan

2
Bu anahtardır, sadece bir kez CORS'u etkinleştirmelisiniz, benim sorunum app.config ve app.config dosyamda da etkinleştirmiş olmamdı ... web.config girişini kaldırdım ve sadece uygulamayı kullandım. (Microsoft.Owin.Cors.CorsOptions.AllowAll); bunun yerine yöntem.
Mohammad Sepahvand

1
Yukarıdaki çizgi hayatımı kurtardı! CORS'u bir kereden fazla etkinleştirmediğinizden emin olun, aksi takdirde bu gerçekleşecek ve çok hüsrana uğrayacaksınız.
TGarrett

<add name = "Access-Control-Allow-Headers" value = "Content-Type" /> öğesini web.config'den
kaldırdı

1
"Bu anahtardır, CORS'yi yalnızca bir kez etkinleştirmelisiniz" <- BU, @MohammadSepahvand TEŞEKKÜRLER. .NET'e dönün ve şimdiden şaşırdı: D.
Tuan Jinn

42

Cors 5.1.0.0 kullanıyorum, çok fazla baş ağrısından sonra, sorunun sunucudan Access-Control-Allow-Origin & Access-Control-Allow-Header başlıklarının kopyalanması olduğunu keşfettim.

config.EnableCors()WebApiConfig.cs dosyasından kaldırıldı ve yalnızca[EnableCors("*","*","*")] Controller sınıfındaki özniteliği

Kontrol bu yazıyı daha fazla ayrıntı için.


bu benim için çalışıyor, sadece web.config
Crismogram

12

Kayıt WebApiConfig'e Ekle

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Veya web.config

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>  
</httpProtocol>

AMA İKİSİDE DEĞİL


2
Bu benim için anahtar çözümdü, ikisini birden yapmayın.
robnick

8

Aslında birden fazla başlık ayarlayamazsınız Access-Control-Allow-Origin(veya en azından tüm tarayıcılarda çalışmaz). Bunun yerine, koşullu olarak bir ortam değişkeni belirleyebilir ve bunu Headeryönergede kullanabilirsiniz :

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

Bu nedenle, bu örnekte yanıt başlığı yalnızca bir istek başlığı OriginRegExp ile ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$eşleşirse eklenecektir : (temelde HTTP veya HTTPS üzerinden localhost ve HTTPS üzerinden * .my.base.domain anlamına gelir).

setenvifModülü etkinleştirmeyi unutmayın .

Dokümanlar:

BTW. }eİçinde %{ORIGIN_SUB_DOMAIN}ebir yazım hatası değildir. Yönergede ortam değişkenini bu şekilde kullanırsınız Header.


1
Birden fazla erişim kontrol başlığı ayarlamamak için bir kaynağınız var mı? Bunu doğrulayan hiçbir şey bulamıyorum.
Spencer

Çok akıllı ve temiz bir çözüm. Benim için çalıştı.
Alex Kalmikov

@Spencer "Not: Pratikte kaynak-liste-veya-boş üretim daha kısıtlıdır. Boşluklarla ayrılmış bir kaynak listesine izin vermek yerine, ya tek bir kaynak ya da" boş "dizesidir ." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

Bende de hem OWIN hem de WebAPI'm vardı, görünüşe göre her ikisi de CORS'un ayrı ayrı etkinleştirilmesine ihtiyaç duydu ve bu da sonuçta 'Access-Control-Allow-Origin' header contains multiple values hatayı .

CORS'yi etkinleştiren TÜM kodu kaldırdım ve ardından system.webServerWeb.Config'imin düğümüne aşağıdakileri ekledim :

<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>

Bunu yapmak, OWIN (oturum açmaya izin vermek) ve WebAPI (API çağrılarına izin vermek) için CORS gereksinimlerini karşıladı, ancak yeni bir sorun yarattı: OPTIONSAPI çağrılarım için ön kontrol sırasında bir yöntem bulunamadı. Bunun düzeltmesi basitti - sadece aşağıdakileri handlersmy Web.Config düğümünden kaldırmam gerekiyordu :

<remove name="OPTIONSVerbHandler" />

Umarım bu birine yardımcı olur.


7

Apache Sunucusu:

Ben de aynısını harcıyorum, ancak bunun nedeni dosyamda sunucuya erişim sağlayan yıldız işaretinin (") olmamasıydı, örneğin '.htaccess':

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

Ayrıca, başka bir '.htaccess' çıkışı olan bir klasörde bir '.htaccess' dosyanız olabilir, örn.

/ 
- .htaccess 
- public_html / .htaccess (problem here)

Sizin durumunuzda '*' yerine yıldız işareti ip (http://127.0.0.1:9000 veri sunma izni verdiğiniz ) sunucusu .

ASP.NET:

Kodunuzda 'Access-Control-Allow-Origin' kopyası olmadığını kontrol edin.

Geliştirici Araçları:

Chrome ile istek başlıklarınızı doğrulayabilirsiniz. F12 tuşuna basın ve 'Ağ' sekmesine gidin, şimdi AJAX talebini çalıştırın ve listede görünecektir, tıklayın ve orada olan tüm bilgileri verin.

Erişim Kontrolü-İzin Ver-Menşei: *


Bazen bu kadar kolay ... Bu karışık web hizmetini IIS / Chrome üzerinde çalıştırmaya çalışırken Application_BeginRequest yöntemiyle oynadım ve unuttum ... kendi kodumda yineleme! Beni bariz olana yönlendirdiğiniz için teşekkürler! :)
Juergen Riemer

2
CORS yanıt başlıklarını almak için, gerçek bir çapraz kaynak talebini de simüle etmeniz gerekir, bu nedenle çalışan sitedeki ağ sekmesine bakarsanız görünmeyebilir. Bununla birlikte, AJAX isteğinizi çalıştırmak için DHC gibi bir şey ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) kullanmak teknik olarak farklı bir etki alanından arama yapıyor olacak, dolayısıyla CORS'u tetikleyecek ve görmenizi sağlayacak Erişim Kontrolü başlıkları.
Henry C

4

Bu, birden çok konumda yapılandırılmış Cors seçeneğiniz olduğunda gerçekleşir. Benim durumumda, hem denetleyici düzeyinde hem de Startup.Auth.cs / ConfigureAuth'da vardı.

Anladığım kadarıyla, uygulama genişliğini istiyorsanız, bunu Startup.Auth.cs / ConfigureAuth altında şu şekilde yapılandırın ... Microsoft.Owin.Cors'a başvurmanız gerekecek.

public void ConfigureAuth(IAppBuilder app)
        {
          app.UseCors(CorsOptions.AllowAll);

Denetleyici düzeyinde tutmayı tercih ederseniz, yalnızca Denetleyici düzeyinde ekleyebilirsiniz.

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;

Benim durumumda onu hem Web.Config hem de MyAppApiConfig.cs içinde ayarladım. Onu ikinciden çıkarmak sorunu benim için çözdü.
Jim B

4

IIS'teyseniz web.config'de CORS'u etkinleştirmeniz gerekir, ardından App_Start / WebApiConfig.cs Register yönteminde etkinleştirmeniz gerekmez.

Benim çözümüm, buradaki satırları yorumladı:

// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);

ve web.config dosyasına yazın:

<system.webServer>
  <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>


2

Bu, elbette Access-Control-Allow-Originbaşlığınızı birden çok değere sahip olacak şekilde ayarladıysanız da olabilir - Örneğin , RFC'de desteklenen bir tür, ancak aslında çoğu büyük tarayıcı tarafından desteklenmeyen virgülle ayrılmış değerler listesi . RFC'nin birden fazla alana '*' kullanılmadan nasıl izin verileceğinden bahsettiğini unutmayın .

Örneğin, Chrome'da aşağıdaki gibi bir başlık kullanarak bu hatayı alabilirsiniz:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

Bu içindeydi Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Bunu bir CDN nedeniyle düşünüyorsanız ve Akamai kullanıyorsanız, Akamai'nin sunucuda önbelleğe almayacağını Vary:Origin , birçok kişinin bu sorunu çözmek için önerdiği şekilde not etmek isteyebileceğinizi unutmayın .

Önbellek anahtarınızın nasıl oluşturulduğunu muhtemelen bir "Önbellek Kimliği Değişikliği" yanıt davranışı kullanarak değiştirmeniz gerekecektir. Bu ilgili StackOverflow sorusunda bu sorunla ilgili daha fazla ayrıntı


Yani temelde, şu anda yapamazsınız çünkü şüpheli olduğu için internetteki her bir alan adının url'ye ulaşmasını isteyeceksiniz.
scottheckel

Akamai bağlantısının giriş yapılması gerekiyor.
Jean-François Savard

evet bu, söz konusu dokümanlar için bir akamai gerekliliği gibi görünüyor ;-(
Brad Parks

Chrome'da bu hatayı almaya başka bir yolu da değerlerin bir boşlukla ayrılmış liste ile geçerli: Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com. Bu olur , doğru bir yol olabilir, ancak tarayıcılar burada standart (uymayan kaynağı ).
tanius

2

Çok aptalca ve basit:

Bu sorun Header always set Access-Control-Allow-Origin *benim için Apache yapılandırma dosyamda iki kez varken ortaya çıktı . Withing kez VirtualHostbir iç etiketleri ve bir kez Limitetiketi:

<VirtualHost localhost:80>
  ...
  Header set Access-Control-Allow-Origin: *
  ...
  <Limit OPTIONS>
    ...
    Header set Access-Control-Allow-Origin: *
    ...
  </Limit>
</VirtualHost>

Bir girişi kaldırmak sorunu çözdü.

Sanırım orijinal gönderide iki kez olurdu:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"

1

bir nodejs sunucusunda bu sorunu yaşadım.

işte ben nasıl düzelttim.
Düğüm sunucumu a üzerinden çalıştırıyorum nginx proxyve nginx'i ve nodeher ikisini de ayarladım ve allow cross domain requestsbundan hoşlanmadım, bu yüzden nginx'ten kaldırdım ve düğümde bıraktım ve her şey yolunda gitti.


Bu cevap için teşekkürler! Bir nginx + Rack (Ruby) kurulumuyla uzun süredir çözemediğim bir sorunu çözdü. Aynı sorun, aynı çözüm: nginx'teki başlık eklemelerini kapatın rack-corsve CORS maddesini gem'in ele almasına izin verin . Bam, düzeltildi.
Pistos

0

Aynı sorunla karşılaştım ve çözmek için bunu yaptım:

WebApi hizmetinde, Global.asax içinde aşağıdaki kodu yazdım:

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

Burada bu kod, yalnızca uçuş öncesi ve belirteç talebinin yanıta "Erişim-Kontrol-İzin Ver-Çıkış" eklemesine izin verir, aksi takdirde eklemeyeceğim.

İşte uygulama hakkındaki blogum: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /


0

php ile IIS kullananlar için, IIS üzerinde sunucu tarafında web.config dosyasını güncelleyin ve kök dizinini (wwwroot) ekleyin ve bunu ekleyin

<?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>

bundan sonra IIS sunucusunu yeniden başlatın, RUN'a IISReset yazın ve şunu girin:


0

İşte yukarıdaki örneklere benzer başka bir örnek, CORS'un nerede olduğunu tanımlayan yalnızca bir yapılandırma dosyanız olabilir: IIS sunucusunda farklı dizinlerde yol üzerinde iki web.config dosyası vardı ve bunlardan biri sanal dizinde gizlendi. Bunu çözmek için, yol sanal dizindeki yapılandırma dosyasını kullandığından kök düzeyindeki yapılandırma dosyasını sildim. Birini veya diğerini seçmek zorunda.

URL called:  'https://example.com/foo/bar'
                     ^              ^
      CORS config file in root      virtual directory with another CORS config file
          deleted this config             other sites using this


0

'Access-Control-Allow-Origin' başlığı birden çok değer içeriyor

Bu hatayı aldığımda bunun için çözüm aramak için tonlarca saat harcadım ama hiçbir şey işe yaramadı, sonunda bu soruna çok basit bir çözüm buldum. '' Access-Control-Allow-Origin 'başlığı yanıtınıza birden fazla kez eklendiğinde bu hata oluşur, apache.conf veya httpd.conf (Apache sunucusu), sunucu tarafı komut dosyanızı kontrol edin ve bu dosyalardan istenmeyen giriş başlığını kaldırın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.