2015-10-21 17 views
5

Próbuję połączyć się z Web API Web Service ASP.NET z angularjs stronie i otrzymuję następującePoświadczenia flaga jest 'prawdziwe', ale „Access-Control-Allow-Poświadczenia

Poświadczenia flaga jest "true", ale nagłówek "Access-Control-Allow-Credentials" to "". Musi być "prawdą", aby umożliwić poświadczenia. Pochodzenie "http://localhost:221" jest zatem niedozwolone.

 var cors = new EnableCorsAttribute("http://localhost:221", "*","GET,PUT,POST,DELETE"); 
     config.EnableCors(cors); 

Stosując ten angularjs

 $http({ 
     method: 'GET', 
     url: 'http://localhost:1980/api/investors/62632', 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 
     withCredentials: true 
     // withCredentials: true, 
    }).then(function onUserComplete(response) { 
     // this callback will be called asynchronously 
     // when the response is available 
    }, function onError(response) { 
     // called asynchronously if an error occurs 
     // or server returns response with an error status. 

Po przeczytaniu wielu artykułów dodam to do pliku web.config

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="http://localhost:221" /> 
    </customHeaders> 
</httpProtocol> 

i dostaję ten komunikat o błędzie

do „Access- Control-Allow-Origin 'zawiera wiele wartości localhost: 221, localhost: 221, ale tylko jedna jest dozwolona. Origin localhost: 221 nie ma dostępu.

Co naprawdę nie ma sensu, ponieważ dodałem go raz i nie znajduje go, ale dodaję go do web.config i otrzymuję komunikat o tym, że został dodany wiele razy. Przeczytałem wiele artykułów i nie mogę znaleźć właściwej odpowiedzi. Korzystam z Google Chrome. Byłbym bardzo wdzięczny za pomoc, gdy wyciągam teraz włosy.

+0

Sprawdź tę odpowiedź: http://stackoverflow.com/questions/21664988/no-http-resource-error-when-doing- put-post-cors-issue-angularjs-web-api-2/21667606 # 21667606 Musiałem usunąć ustawienia z web.config i pozostawić je w kodzie. Może to być problem z konfiguracją IIS – link64

Odpowiedz

0

Wypróbuj metodę opisaną tutaj przed lotem wniosków:

enabling cross-origin resource sharing on IIS7

I użyć rozszerzenia Chrome Postman lub Fiddler dla łatwiejszego debugowania CORS. Mogę się założyć, że dwa razy dodajesz nagłówek, ale bez całego kodu trudno jest debugować. (do cholery, CORS jest trudny do debugowania nawet z kodem).

Wygląda na to, że nie powinieneś mieć zarówno ustawień web.config, jak i globalnego atrybutu EnableCors() - powoduje to podwojenie.

Wygląda na to, że nie dodajesz żadnej strony serwera, ale może być dodana przez atrybut AllowCors, nie jestem pewien. (Jestem częściowo zainteresowany obsługą CORS w OWIN)

9

Nagłówek jest dwa razy dodawany do kodu, a drugi przez web.config. Obsługa CORS służy do dodawania nagłówków do celów CORS. Niestandardowe nagłówki konfiguracji również dodają nagłówki odpowiedzi do dowolnego żądania, więc możesz chcieć usunąć ustawienie konfiguracyjne.

var cors = new EnableCorsAttribute.. 

<customHeaders> 
    <add name="Access-Control-Allow-Origin" value="http://localhost:221" /> 
</customHeaders> 

Ponieważ oba te obszary dodają dwa razy to samo źródło, otrzymujemy wiele wartości w nagłówku.

Podczas wykonywania wywołania AJAX z parametrem withCredentials: true, nagłówek odpowiedzi powinien mieć wartość Access-Control-Allow-Credentials = true. Trzeba to dodać za pomocą kodu, używając SupportsCredentials = true dla atrybutów CORS.W przeciwnym razie pojawi się błąd „flag Poświadczenia jest«prawdziwe», ale„Access-Control-Allow-Poświadczenia jest «»”

Aby uzyskać więcej informacji na temat parametru withCredential i wygląd nagłówka odpowiedzi na to artykuł:

http://www.ozkary.com/2015/12/api-oauth-token-access-control-allow-credentials.html

nadzieję, że to pomaga.

+4

Niezły komentarz na temat SupportsCredentials = true attibute. Dla kogo, kto używa WebApiConfig.cs: config.EnableCors (new EnableCorsAttribute ("\ *", "\ *", "\ *") {SupportsCredentials = true}); –

+0

@RomanO Dziękuję, to jedyne rozwiązanie, które faktycznie zadziałało dla mnie – developer

+0

@RomanO, powinieneś zaproponować swoją odpowiedź jako odpowiedź na pytanie. To jedyne rozwiązanie, które sprawdziło się po wielu godzinach poszukiwań. – Kesty

1

Natknąłem się na to pytanie, próbując trafić webapi na rdzeń .net z aplikacji angular2. Musiałem dodać AllowCredentials() do konfiguracji cors w mojej metodzie Configure w pliku Startup.cs, aby wyglądało jak poniżej.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 
    app.UseCors(builder => 
     builder 
     .AllowCredentials() 
     .WithOrigins("http://localhost:3000")); 
    ... 
} 
7

Dla kogo, kto używa WebApiConfig.cs:

config.EnableCors(new EnableCorsAttribute("*", "*", "*") { SupportsCredentials = true }); 
Powiązane problemy