WCF に問題がある - SOAP ヘッダーに署名する必要がない Weblogic サービスに接続する場合 (つまり、< TO >、< ACTION >、< MessageID > およびその他の WS-Addressing 要素) に署名する必要はありません。リクエストでは、WCFはデフォルトでこれらに署名していますが、応答でも署名されることを期待していることを除いて問題にはなりません.WCFからこの例外が返されます:
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....
Web サービス クライアントの他の要素に CustomEncoder と Custom Behaviors を使用していますが、このルートを介してデフォルト要素の署名を無効にできないようです - IEndpointBehaviour で以下にアクセスしようとしました
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
ChannelProtectionRequirements requirements = bindingParameters.Find<ChannelProtectionRequirements>();
requirements.IncomingSignatureParts...
requirements.OutgoingSignatureParts...
}
しかし、HeaderTypes
WCF プロセスのメッセージ動作段階では、これらのコレクションの数は常にゼロです。
また、MessageHeaderAttribute
IClientMessageInspector にアクセスしようとして、次のものを追加しようとしましたが、役に立ちませんでした。
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");
}
ここに私の設定があります -
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 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;
}
したがって、可能な方法で2つのことのいずれかを実行できる必要があります-
これらのヘッダー要素に対するクライアントのリクエストの署名をオフにして、着信応答で署名されることを期待しないようにするか、
応答 XML にデジタル署名がないことを無視して続行するように WCF に指示します。