문제

인터넷 호스팅 공급자에 웹 애플리케이션을 배포했습니다.이 웹 응용 프로그램은 회사 데이터베이스에 대한 데이터 액세스를 위해 회사 응용 프로그램 서버에 있는 IIS 서버에 배포된 WCF 서비스를 사용합니다. 네트워크 담당자는 보안상의 이유로 방화벽을 통해 이 WCF 서비스를 노출하도록 허용했습니다.다이어그램은 다음과 같습니다.

[호스팅 페이지] ---> (인터넷) ---> |방화벽 <Public IP>:<Port-X >| ---> [WCF 서비스가 포함 된 II <Comp. Network Ip>:<Port-Y>]

또한 wsHttpBinding을 사용하여 보안 기능을 활용하고 중요한 정보를 암호화하고 싶었습니다.

시도해 본 후 다음 오류가 발생합니다.

예외 세부정보:System.ServiceModel.EndpointNotFoundException:'http : // : /service/wcfservice.svc'에 대한 메시지는 endpointdispatcher의 주소 필터 불일치로 인해 수신기에서 처리 할 수 ​​없습니다.발신자와 수신자의 endpointAddresses가 동의하는지 확인하십시오.

몇 가지 조사를 통해 wsHttpBinding이 WS-Addressing 표준을 사용한다는 사실을 알게 되었고, 이 표준에 대해 읽으면서 SOAP 헤더가 'MessageID', 'ReplyTo', 'Action' 및 'To'와 같은 태그를 포함하도록 향상되었다는 것을 알게 되었습니다.

그래서 나는 클라이언트 애플리케이션 엔드포인트가 방화벽 IP 주소와 포트를 지정하고 서비스가 방화벽의 IP와 다른 내부 네트워크 주소로 응답하기 때문에 WS-Addressing이 위의 메시지를 발생시키는 것으로 추측합니다.나는 이것이 매우 좋은 보안 조치라고 생각하지만 내 시나리오에서는 그다지 유용하지 않습니다.

WS-Addressing 표준 제출물 인용(http://www.w3.org/Submission/ws-addressing/)

"현재 광범위한 네트워크 기술 (예 : NAT, DHCP, 방화벽)의 범위로 인해 많은 배포는 의미있는 글로벌 URI를 주어진 엔드 포인트에 할당 할 수 없습니다.이러한 '익명'엔드 포인트가 메시지 교환 패턴을 시작하고 답장을 받도록하려면 WS-addressing은 안정적이고 해결할 수있는 URI를 가질 수없는 엔드 포인트로 사용하기 위해 다음과 같은 잘 알려진 URI를 정의합니다. http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"

방화벽의 IP 주소를 지정하고 SOAP 메시지 헤더의 'To' WS-Addressing 태그에 지정된 주소를 무시하거나 우회하도록 wsHttpBinding 끝점을 구성하려면 어떻게 해야 합니까?아니면 서비스 엔드포인트 구성에서 무언가를 변경해야 합니까?

도움과 안내를 주시면 감사하겠습니다.

마르코.

추신.:이에 대한 해결책을 찾는 동안에는 물론 전혀 문제 없이 basicHttpBinding을 사용하고 있습니다.

도움이 되었습니까?

해결책

다음을 사용하여 서비스 클래스를 꾸며볼 수도 있습니다.

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

다른 팁

이를 처리하는 더 안전한 방법은 엔드포인트 ListenUri를 서비스 Url로 설정하고 엔드포인트 Address를 클라이언트가 메시지를 보내는 외부 엔드포인트로 설정하는 것입니다.이런 방식으로 서비스는 모든 주소가 아닌 해당 주소로만 전달되는 메시지를 "신뢰"합니다.

Mitch Baker의 솔루션에 대해 모르고 시도한 적도 없습니다.그러나 여기에는 생성된 코드를 수정하는 작업이 포함됩니다.이 문제를 해결하는 또 다른 방법이 있습니다.

svcutil.exe를 사용하여 방화벽을 가리키는 MEX 주소를 제공하는 클라이언트 코드를 생성했다고 가정합니다.이렇게 하면 필요한 모든 구성이 App.config(또는 Web.config)에 추가됩니다.그러나 구성의 서비스 주소는 실제 서비스 주소를 가리킵니다(WSDL 파일에서 서비스 주소는 실제 서비스 주소가 됩니다).

그래서 제가 생각하는 방법은 이 문제를 해결해 줄 것입니다.

  1. MEX 주소를 제공하여 클라이언트 코드를 생성합니다(예:http://:Port-X/service/wcfservice.svc?wsdl).그러면 필요한 모든 구성이 생성됩니다.

  2. 클라이언트 생성자를 호출할 때 방화벽의 URI를 EnpointAddress로 제공하고 생성된 구성의 구성 이름을 제공합니다.이렇게 하면 클라이언트는 마치 서비스에 보내는 것처럼 메시지를 방화벽 주소로 보냅니다.

    client = new ServiceClient(endpointConfigName, new System.ServiceModel.EndpointAddress("http://:Port-X/service/wcfservice.svc"));

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top