[asp.net-web-api] ‘Access-Control-Allow-Origin’헤더에 여러 값이 포함되어 있습니다.

클라이언트 측에서 AngularJS $ http를 사용하여 서버 측에서 ASP.NET 웹 API 애플리케이션의 끝점에 액세스하고 있습니다. 클라이언트가 서버와 다른 도메인에서 호스팅되므로 CORS가 필요합니다. $ http.post (url, data)에서 작동합니다. 하지만 사용자를 인증하고 $ http.get (url)을 통해 요청하자마자 메시지가 나타납니다.

'Access-Control-Allow-Origin'헤더에는 'http://127.0.0.1:9000, http://127.0.0.1:9000'값이 여러 개 포함되어 있지만 하나만 허용됩니다. 따라서 원본 'http://127.0.0.1:9000'은 액세스가 허용되지 않습니다.

Fiddler는 성공적인 옵션 요청 후 get 요청에 실제로 두 개의 헤더 항목이 있음을 보여줍니다. 내가 무엇을 어디에서 잘못하고 있습니까?

최신 정보

$ http.get 대신 jQuery $ .get을 사용하면 동일한 오류 메시지가 나타납니다. 따라서 이것은 AngularJS에 문제가없는 것 같습니다. 그러나 그것이 잘못된 곳은 어디입니까?



답변

나는 추가했다

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

만큼 잘

app.UseCors(CorsOptions.AllowAll);

서버에서. 결과적으로 두 개의 헤더 항목이 생성됩니다. 후자를 사용하면 작동합니다.


답변

모범 사례 (예 : http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) 에 따라 CORS를 설정했기 때문에이 문제가 발생했습니다. 또한 <add name="Access-Control-Allow-Origin" value="*"/>web.config에 사용자 지정 헤더 가 있습니다.

web.config 항목을 제거하면 모두 정상입니다.

@mww의 답변과는 달리 EnableCors()WebApiConfig.cs 및 EnableCorsAttribute컨트롤러에 여전히 있습니다 . 둘 중 하나를 꺼냈을 때 다른 문제가 발생했습니다.


답변

나는 Cors 5.1.0.0을 사용하고 있는데, 많은 두통 끝에 서버의 Access-Control-Allow-Origin & Access-Control-Allow-Header 헤더가 중복되는 문제를 발견했습니다.

config.EnableCors()WebApiConfig.cs 파일에서 제거 되었으며 [EnableCors("*","*","*")]Controller 클래스에 속성 만 설정했습니다.

자세한 내용이 기사 를 확인하십시오 .


답변

WebApiConfig 등록에 추가

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

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

하지만 둘 다 아닙니다


답변

실제로 여러 헤더를 설정할 수 없습니다 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)$(기본적으로 HTTP 또는 HTTPS를 통한 localhost 및 HTTPS를 통한 * .my.base.domain을 의미 함).

setenvif모듈 을 활성화하는 것을 잊지 마십시오 .

문서 :

BTW. }e에서는 %{ORIGIN_SUB_DOMAIN}e오타가 아닙니다. Header디렉티브 에서 환경 변수를 사용하는 방법 입니다.


답변

나도 OWIN과 WebAPI를 모두 가지고 있었는데 둘 다 CORS를 별도로 활성화해야했기 때문에 'Access-Control-Allow-Origin' header contains multiple values오류가 발생했습니다.

CORS를 활성화 한 모든 코드를 제거한 다음 system.webServerWeb.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>

이렇게하면 OWIN (로그인 허용) 및 WebAPI (API 호출 허용)에 대한 CORS 요구 사항이 충족되었지만 새로운 문제가 발생했습니다. OPTIONSAPI 호출을위한 프리 플라이트 중에 메서드를 찾을 수 없습니다. 이에 대한 수정은 간단했습니다 handlers. Web.Config 노드 에서 다음을 제거하면됩니다 .

<remove name="OPTIONSVerbHandler" />

이것이 누군가를 돕기를 바랍니다.


답변

Apache 서버 :

나는 똑같이 지출하지만, 서버에 대한 액세스를 제공 한 파일에 별표 ( “)가 없었기 때문입니다 (예 : ‘.htaccess.’).

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

다른 ‘.htaccess’가있는 폴더에 ‘.htaccess’파일이있을 수도 있습니다.

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

귀하의 경우 ‘*’대신 별표는 http://127.0.0.1:9000데이터 제공 권한을 부여 하는 ip ( ) 서버입니다.

ASP.NET :

코드에 ‘Access-Control-Allow-Origin’중복이 없는지 확인하십시오.

개발자 도구:

Chrome을 사용하면 요청 헤더를 확인할 수 있습니다. F12 키를 누르고 ‘네트워크’탭으로 이동하여 이제 AJAX 요청을 실행하고 목록에 표시되고 클릭하여 모든 정보를 제공합니다.

액세스 제어 허용 출처 : *