2

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...
}

しかし、HeaderTypesWCF プロセスのメッセージ動作段階では、これらのコレクションの数は常にゼロです。

また、MessageHeaderAttributeIClientMessageInspector にアクセスしようとして、次のものを追加しようとしましたが、役に立ちませんでした。

 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つのことのいずれかを実行できる必要があります-

  1. これらのヘッダー要素に対するクライアントのリクエストの署名をオフにして、着信応答で署名されることを期待しないようにするか、

  2. 応答 XML にデジタル署名がないことを無視して続行するように WCF に指示します。

4

2 に答える 2

1

これは少し前に尋ねられましたが、解決策を探しているときにこの質問を見つけました。

だからここに私のために働いたものがあります。カスタム バインディングで enableUnsecuredResponse="true" を設定するだけです。

<customBinding>
    <binding name="WsHttpSoap11" >          
        <textMessageEncoding messageVersion="Soap11WSAddressing10" />            
        <security authenticationMode="UserNameOverTransport" enableUnsecuredResponse="true"></security>
        <httpsTransport/>
    </binding>
  </customBinding>
于 2015-02-17T10:25:34.637 に答える
-1

私の最初の予感は、requirements.IncomingSignatureParts パスを機能させる何らかの方法があるということです。ただし、フォールバックは、単純に ws-addressing をすべてオフにして (たとえば、メッセージ バージョン "Soap11" を使用)、メッセージ インスペクター/エンコーダーに手動で追加することです。

于 2012-09-11T09:40:15.507 に答える