2012-09-10 3 views
2

WCF에 문제가 있습니다. SOAP 헤더가 서명 될 필요가없는 Weblogic 서비스에 연결 - 예 : < TO>, < ACTION>, < MessageID> 및 기타 WS-Addressing 요소는 서명 할 필요가 없습니다. 요청에 WCF는 다음 또한 응답에 서명하기를 기대하고 있어요 제외하고는 문제가되지 않을 것이다, 어쨌든 기본적으로이 서명하고, 나는 WCF에서 반환이 예외를 얻을 : 난WCF 및 SOAP 헤더 - 기본 헤더 요소가 요청에 서명되지 않도록하는 방법은 무엇입니까?

System.ServiceModel.Security.MessageSecurityException: 

The 'To', 'http://www.w3.org/2005/08/addressing' required message part was not  signed.\r\n\r\nServer stack trace: \r\n at 

System.ServiceModel.Security.WSSecurityOneDotZeroReceiveSecurityHeader.ExecuteMessageProtectionPass(Boolean hasAtLeastOneSupportingTokenExpectedToBeSigned)\r\n at 
System.ServiceModel.Security.ReceiveSecurityHeader.Process(TimeSpan timeout, ChannelBinding channelBinding, ExtendedProtectionPolicy extendedProtectionPolicy)\r\n at 
System.ServiceModel.Security.MessageSecurityProtocol.ProcessSecurityHeader(ReceiveSecurityHeader securityHeader, Message& message, SecurityToken requiredSigningToken, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)\r\n at 
System.ServiceModel.Security.AsymmetricSecurityProtocol.VerifyIncomingMessageCore(Message& message, String actor, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)\r\n at System.ServiceModel.Security.MessageSecurityProtocol.VerifyIncomingM.... 

을 CustomEncoder와 웹 서비스 클라이언트의 다른 요소에 대한 사용자 정의 동작을 사용하지만 그럴수는이 경로를 통해 기본 요소의 서명을 해제하는 것 - 나는 IEndpointBehaviour

에서 아래
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
{ 
    ChannelProtectionRequirements requirements = bindingParameters.Find<ChannelProtectionRequirements>(); 
    requirements.IncomingSignatureParts... 
    requirements.OutgoingSignatureParts... 
} 

그러나 이들의 HeaderTypes의 수에 접근하려고했습니다 컬렉션은 WCF 프로세스의 메시지 동작 단계에서 항상 제로입니다.

또한 IClientMessageInspector에서 MessageHeaderAttribute에 액세스하려고 시도했지만 다음을 추가하려고했지만 유용하지 않았습니다.

public static CustomBinding GetServiceBinding() 
    {    
     //Get custom binding reference from app.config 
     CustomBinding binding = new CustomBinding("CUS_BINDING"); 
     binding.ReceiveTimeout = new TimeSpan(0, 0, 15, 0); 
     binding.SendTimeout = new TimeSpan(0, 0, 15, 0); 
     // Reference the asymettric security element    
     AsymmetricSecurityBindingElement securityBindingElement = binding.Elements.Find<AsymmetricSecurityBindingElement>(); 
     // Get the x509ProtectionParams from the security element 
     X509SecurityTokenParameters tokenParameters = new X509SecurityTokenParameters(); 
     tokenParameters.X509ReferenceStyle = X509KeyIdentifierClauseType.IssuerSerial; 
     tokenParameters.RequireDerivedKeys = false; 
     tokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient; 

     securityBindingElement.InitiatorTokenParameters = tokenParameters; 
     //securityBindingElement.ProtectionTokenParameters = tokenParameters; 
     securityBindingElement.LocalClientSettings.DetectReplays = false; 

     //Set timestamp to false as it's not in the request 
     securityBindingElement.IncludeTimestamp = false; 
     // Added during testing, permanant fixture 
     securityBindingElement.RequireSignatureConfirmation = true; 
     securityBindingElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;    

     return binding; 
    } 

그래서 내가 중 하나를 수행 할 수 있어야 XML에

설정

<binding name="CUS_BINDING" > 
     <transactionFlow /> 
     <security defaultAlgorithmSuite="TripleDesRsa15" 
       authenticationMode="MutualCertificate" 
       messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10" 
       requireDerivedKeys="false" 
       messageProtectionOrder="SignBeforeEncrypt" 
       securityHeaderLayout="Lax" 
       allowSerializedSigningTokenOnReply="true" 
       enableUnsecuredResponse="true"      
        > 

     <secureConversationBootstrap authenticationMode="CertificateOverTransport" 
            messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" 
            requireDerivedKeys="false" 
             /> 
     </security> 
     <customTextMessageEncoding messageVersion="Soap11WSAddressing10" /> 
     <httpsTransport requireClientCertificate="true" /> 
    </binding> 

구성 코드 조정 - 여기

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) { int headerIndex = request.Headers.FindHeader("To", "http://www.w3.org/2005/08/addressing"); } 

내 설정이다 를 통해 두 가지 가능한 뉴욕 방법 - 그들이 예상하지 않을 수 있도록

  1. 이 헤더 요소에 대한 클라이언트의 요청에 서명 해제

    들어오는 reponse에 로그인하거나

  2. 은의 부족을 무시하는 WCF에게 응답 XML에서 디지털 서명을 수행하고 진행하십시오.

답변

-1

제 초기의 직감은 requirements.IncomingSignatureParts 경로를 작동시키는 몇 가지 방법이 있다는 것입니다. 하지만 대체로 ws 주소 지정을 모두 해제 (예 : 메시지 버전 "Soap11"사용) 한 다음 메시지 관리자/인코더에서 수동으로 추가하는 것입니다.

0

이 질문은 얼마 전에 있었지만 해결책을 찾기 위해이 질문을 발견했습니다.

그래서 나를 위해 일한 것이 여기 있습니다. 커스텀 바인딩에서 enableUnsecuredResponse = "true"로 설정하십시오.

<customBinding> 
    <binding name="WsHttpSoap11" >   
     <textMessageEncoding messageVersion="Soap11WSAddressing10" />    
     <security authenticationMode="UserNameOverTransport" enableUnsecuredResponse="true"></security> 
     <httpsTransport/> 
    </binding> 
    </customBinding>