2008-09-15 4 views
2

우리는 타사 SOAP 서비스에 연결해야하며 WCF를 사용하고 있습니다. 이 서비스는 Apache AXIS를 사용하여 개발되었으며, 우리는이 서비스를 제어 할 수 없으며 작동 방식을 변경하지 않습니다. 우리가보고있는 문제는 요청이 웹 서비스 보안을 사용하여 포맷되기를 기대하기 때문에 정확한 서명 등을하고 있습니다.하지만 제 3 자의 응답은 안전하지 않습니다. 철사를 킁킁 거리면 응답이 잘 돌아옵니다 (타임 스탬프, 서명 등은 없지만). 기본 .NET 구성 요소는 보안 문제로 간주하기 때문에 오류가 발생하므로 실제 비누 응답을받지 못합니다. 보안 요청을 보내도록 WCF 프레임 워크를 구성하는 방법이 있습니까? 그러나 응답의 보안 필드가 필요하지는 않습니까? OASIS 사양을 살펴보면 응답이 안전해야한다는 요구는 나타나지 않습니다.요청에 보안을 사용하도록 WCF에 알리는 방법이 있습니까? 그렇지만 응답에서 무시하십시오.

우리가받을 예외는 다음과 같습니다 : 내용

, 여기에 우리가 볼 수있는 예외입니다, 내가 본 덧붙여

System.ServiceModel.Security.MessageSecurityException was caught 
    Message="Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties. This can occur if the service is configured for security and the client is not using security." 
    Source="mscorlib" 
    StackTrace: 
    Server stack trace: 
     at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessageCore(Message& message, TimeSpan timeout) 
     at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout) 
     at System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates) 
     at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) 
     at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout) 
     at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
     at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 

을 알리는 게시물의 많은 당신은 밖으로, 다음의 타임 스탬프를 떠날 경우 보안 필드는 예상되지 않습니다. 이것은 옵션이 아닙니다 - 우리가 통신하는 서비스는 타임 스탬프를 요구합니다.

답변

2

웃기는 당신은이 질문을해야합니다. 나는 1 년 전에 이것을 어떻게 할 것인지 마이크로 소프트에게 물었다. 당시 .NET 3.0을 사용하는 것은 가능하지 않았습니다. 그것이 3.5 세계에서 바뀌 었는지 확실하지 않습니다. 그러나 아니요, 요청에 보안을 추가하고 응답을 비워 두는 물리적 인 방법은 없었습니다.

이전 고용주는 요청시 인증서를 사용하는 WS-Security 헤더가 필요한 모델을 사용했지만 응답은 보안되지 않은 채로있었습니다.

ASMX 웹 서비스 및 WSE에서는이 작업을 수행 할 수 있지만 WCF 버전 3.0에서는 수행 할 수 없습니다.

2

구성만으로는 벗어날 수없는 좋은 기회입니다. 저는 Axxis (WSE3 - WCF의 조상이었습니다)와의 일부 통합 작업을 수행해야했으며 WSE3에 전달하기 전에 Axxis의 응답을 완화하기 위해 WSE3의 파이프 라인에 코드를 작성해야했습니다. 좋은 소식은이 핸들러를 파이프 라인에 추가하는 것이 매우 간단하고 핸들러에서 한 번만 SoapMessage의 인스턴스를 가져 와서 원하는 모든 작업을 수행 할 수 있다는 것입니다 (예 : 타임 스탬프 제거 등)

3

Microsoft는 현재이 기능에 대한 핫픽스를 제공합니다.

http://support.microsoft.com/kb/971493

+0

또한이 패치는 .NET 3.0 핫픽스도 있습니다 .NET 3.5 SP1 –

+1

의 일부입니다,하지만 요청에 있습니다. 또한 3.5 SP1 용 핫픽스는 Windows 7 SP1 (및 Server 2008)에서도 사용 가능합니다. – nickvane