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"); }
내 설정이다 를 통해 두 가지 가능한 뉴욕 방법 - 그들이 예상하지 않을 수 있도록
- 이 헤더 요소에 대한 클라이언트의 요청에 서명 해제
들어오는 reponse에 로그인하거나
은의 부족을 무시하는 WCF에게 응답 XML에서 디지털 서명을 수행하고 진행하십시오.