1

BeforeSendRequest次のようなメソッドで、カスタム ヘッダーを変更して SOAP メッセージに追加しようとしています。

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        MessageHeader header = MessageHeader.CreateHeader("name", "http://myname", "Oscar");
        request.Headers.Add(header);

        return null;
    }

この時点ですべて問題ありません。ヘッダーは次のように SOAP ヘッダーに追加されます。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<name xmlns="http://myname">Oscar</name>
</s:Header>

問題は、ヘッダーにもっと大きなものを追加したいということで、最終結果は次のようになります。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:Username xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">username</wsse:Username>
      <wsse:Password xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">password</wsse:Password>
    </wsse:UsernameToken>
</wsse:Security>
</s:Header>

これを達成する方法はありますか?

PS。みんなお願いします:-)私を批判しないでください、私は次の状況にあります:

このユーザー名とパスワードの認証を追加するときは、以上にする必要がありますhttps。問題は、私が通信しようとしているこの Java ベースの Web サービスが下にあることです。3 番目のリンクによると、 「それは悪い習慣と見なされるhttpため、準拠していないと思います。セキュリティで保護されていない接続を介して資格情報を渡します」が、構成ファイルにヘッダーを追加することで解決しました(私が成功しなかったこと)。

私もこれらのリンクを読んで試してみました。また、リンク 1 と 2 から何かを行うと、Visual Studio で「http ではなく https が期待される」というような例外が発生したため、メソッドMessageInspectorsを使用しようとしています。BeforeSendRequest

  1. https 経由のユーザー名で WS-Security 用に WCF を構成する

  2. http://www.west-wind.com/weblog/posts/2007/Dec/09/Tracing-WCF-Messages

  3. http://www.fransson.net/blog/credentials-over-plain-http-with-wcf/

4

3 に答える 3

1

ClearUsernameBindingが解決策です

于 2012-05-16T12:30:59.067 に答える
0

私のサービスはhttpsでしたが、同じ問題がありました。これは構成の問題であり、手動で処理する必要はありません。

とにかく、BeforeSendRequest を使用して MessageInspector を使用する必要はありません。いくつかのセキュリティ構成を追加して、構成生成コードを変更してみてください。その後、WCF は必要なヘッダーを作成します。次に、コードに資格情報を追加すると、問題ありません。

生成されたプロキシが customBinding または basicHttpBinding を作成していると思います。ただし、WS-Security 仕様をサポートしていないため、これを custom または wsHttpBinding に変更する必要があります。操作して正しい構成を見つけて、目的の結果を得ることができます。

私が追加したのは「サンプル構成構文」です。

<customBinding>
        <binding name="MessageServerBinding">
          <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport"
            requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
            <secureConversationBootstrap />
          </security>
........
</binding>
</customBinding>

これはサンプル構成です。たとえば、タイムスタンプを含める必要がない場合や、ナンスが必要な場合がありますが、私の記憶が正しければもう少し手間がかかりますが、それほど多くはありません。

このディスカッションを確認するには: WCF: UsernameToken への Nonce の追加

お役に立てれば。

于 2012-05-16T06:37:19.823 に答える
0

CreateHeader の 3 番目のパラメーターはオブジェクトです。デフォルトでは、このオブジェクトは DataContractSerializer を使用してシリアル化されるため、ヘッダー構造をモデル化するデータ コントラクトを作成する場合、インスタンスを 3 番目のパラメーターとして渡すことができ、必要なヘッダーが作成されます。

于 2012-05-16T02:33:56.137 に答える