2011-08-29 4 views
19

Windows 서비스에서 호스팅되는 WCF REST 서비스가 있으며 모든 응답과 함께 Access-Control-Allow-Origin HTTP 헤더 (CORS 부분으로 정의 됨)를 보내려고합니다.WCF REST 서비스에서 CORS 지원

나의 시도 솔루션은 IDispatchMessageInspector 구현 내에서 다음과 같은 것이 었습니다 :

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
    if (httpResponse != null) 
    { 
     // test of CORS 
     httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; 
    } 
} 

는 일반적으로이 작업 것이다, 그러나 불행하게도 내 서비스는 요청이 허가없이 들어올 때 즉, HTTP basic authorization를 사용 WCF는 자격 증명을 묻는 401 응답을 자동으로 보냅니다. 아쉽게도 WCF는이 초기 교환 도중 IDispatchMessageInspector를 호출하지 않으므로 Access-Control-Allow-Origin 헤더가 초기 교환에 추가되지 않습니다.

브라우저에서 서비스를 호출 할 때 문제가 발생합니다. CORS는 원본 도메인이 Access-Control-Allow-Origin 응답 헤더 (*가 모든 도메인과 일치 함)에 나열된 도메인과 일치하는 경우에만 교차 출처 요청이 허용되어야한다고 지정합니다. 불행하게도 브라우저가 Access-Control-Allow-Origin 헤더없이 초기 401 응답을 볼 때 액세스가 차단됩니다 (same origin policy에 따라).

WCF에서 자동으로 보낸 초기 401 응답에 헤더를 추가하는 방법이 있습니까?

+0

어디서나 이걸 가지고 있었습니까? –

답변

6

HttpModule을 impelementing + 등록하는 것만으로 직접 권한 부여를 처리해야합니다. 거기에서 401을 발행하고 원하는 http 헤더를 ... 여기에 SO에 샘플 구현 - Adding basic HTTP auth to a WCF REST service

편집을 참조 - OP에서 코멘트 후 : OP의 코멘트 이후

그가 자기 호스팅 솔루션을하지 HTTPModule와 실제로 IDispatchMessageInspector.BeforeSendReply로하고 IDispatchMessageInspector.AfterReceiveRequest을 함께 것을 말한다 .

인증을 "없음"으로 설정하고 사용자 정의를 IDispatchMessageInspector에서 구현/처리해야합니다. 이렇게하면 401을 발행 할 때 헤더를 추가 할 수 있습니다. 그렇지 않으면 Basic Auth를 처리하는 런타임에서 올바른/긍정적 인 인증 전에 IDispatchMessageInspector을 호출하지 않습니다. 이 비록

+0

답장을 보내 주셔서 감사합니다. 내 서비스는 IIS가 호스팅하지 않고 자체 호스팅 Windows 서비스 여야합니다. 내 서비스의 HTTP 기본 인증 정보는 훌륭하게 작동합니다. CORS도 잘 작동합니다 (기본 인증을 사용하지 않는다고 가정). 이 문제는 자체 호스팅 서비스에서 HTTP 기본 및 CORS를 혼합 할 때만 발생합니다. IIS에서 서비스를 호스팅하려면 모든 요청에 ​​CORS 응답 헤더를 보내고 HTTP 기본 인증에 HttpModule을 사용하도록 IIS를 구성해야합니다. – Kevin

+0

ok - 편집을 참조하십시오. 솔루션이 이미 절반 정도였습니다 ... 다른 하나의 메소드를 구현하고 구성을 변경해야합니다 ... – Yahia

+0

clientCredentialType = "None"으로 설정하고 수동으로 검사를 수동으로 수행하면 거의 작동합니다. 401 회신을 보낼 수 있지만 WCF에서는 WWW-Authenticate 응답 헤더를 설정할 수 없습니다. 코드 내에서 WWW-Authenticate를 설정하면 WCF가 504를 반환합니다. WWW-Authenticate가 없으면 브라우저에서 자격 증명을 묻지 않습니다. – Kevin

22

이 사람은 내 일을 저장 ... 이것은 당신이 적절한 이행을 보장하기 위해 appriopriate 조치를 취할 필요하므로 보안 sensitiv 코드를 직접 구현하고 의미 조심 작동합니다.

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

나는 웹 페이지가 언젠가 죽기 단지의 경우, 여기에 그의 노트의 일부를 배치 할 예정이다. (I 링크 "당신의 대답은 바로 여기"찾는 싫어, 다음 링크가 죽었어요.)

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webSupport"> 
     <webHttp /> 
     <CorsSupport /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<services> 
    <service name="Service.JSonService"> 
    <endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" /> 
    </service> 
</services> 

지금, 당신은 "WebHttpCors.dll"라고 자신의 다운로드 라이브러리를 찾을 수있다.

하지만 Google에 도움이 될만한 위 내용이 있습니다./해결 방법을 찾으십시오.

내 시나리오에서 루프를 내게 던져 준 부분은 IE가 작동하지만 Firefox가 작동하지 않는다는 것입니다.

내 원래 페이지이었다

http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

그래서 나는 로컬 호스트 < <했다 - >> 로컬 호스트 트래픽 :
http://localhost:53692/test/WCFCallTestViaJQ14.htm 

그래서 내 서비스에있다.

**** 그러나 포트가 다릅니다. (53692 및 8002) ****

IE는 괜찮 았어. 파이어 폭스는 그걸로 괜찮지 않았다.

그런 다음 각 브라우저가 .Send() 요청을 다르게 처리한다는 점을 기억해야합니다 (JQUERY 내부).

이제는 모두 의미가 있습니다. 여기

//JavaScript snipplet 

if (window.XMLHttpRequest) { 

    returnObject = new XMLHttpRequest(); 

} else if (window.ActiveXObject) { 

    returnObject = new ActiveXObject("Microsoft.XMLHTTP"); 

} else { 

msg = "Your browser doesn't support AJAX!"; 

} 

내가 마지막으로 어딘가에 나를 인도/마시고 떠들 인터넷 검색을 봤는데 몇 가지 주요 단어, 구문이다.

Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] 


XMLHttpRequest Send "NS_ERROR_FAILURE" 

JQuery Ajax WCF Self Hosted CORS JSON 
+0

Upvote 모든 세부 정보. 링크 썩음과 좋은 싸움을 계속! – codekaizen

관련 문제