8

認証を使用しない場合に正しく動作する WS クライアントを正常に作成しました。

ただし、サーバー (WebSphere) には ws-security ユーザー名トークンを追加する必要があり、これを行うのに苦労しています。結果の SOAP メッセージは次のようになります。

<soapenv:Envelope 
  xmlns:ns="http://foo.bar/1.0"
  xmlns:ns1="http://www.witsml.org/schemas/140"   
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <soapenv:Header>

    <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UsernameToken wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username>foo</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bar</wsse:Password>    
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">foooooobar==</wsse:Nonce>
        <wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>

  </soapenv:Header>

  <soapenv:Body>
    <ns:fooBar>...</ns:fooBar>
  </soapenv:Body>

Microsoft の WSE 3.0 SDK をダウンロードしてインストールし、Visual Studio 2005 プロジェクトに DLL への参照を追加しました。

Microsoft.Web.Services3.* 名前空間にアクセスできるようになりましたが、現在、どうすればよいか困っています。

クライアント コードは Web 参照によって自動的に生成されているため、認証されていないサーバーにメッセージを送信するためのわずかな作業のみを行います。

WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.Url = "http://foo.bar.baz";
ws.SendSomething(message);

を使用して調査を開始したばかりですMicrosoft.Web.Services3.Security.Tokens.UsernameTokenManagerが、これまでのところ何も起動して実行できていません。

ネット上で良いレシピが見つからないようなので、ヒントをいただければ幸いです。

ありがとう!

4

2 に答える 2

14

プロキシクラスがから継承していることを確認してくださいMicrosoft.Web.Services3.WebServicesClientProtocol

これを行うには、プロキシクラス自体を変更するか、スイッチでwsewsdl3.exeを使用してコマンドラインからプロキシクラスを生成し/type:webClientます。

次に、次のようにクレデンシャルを渡すことができます。

using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Security.Tokens;
using Microsoft.Web.Services3.Security;
.
.
.
WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.RequestSoapContext.Security.Tokens.Add(new UsernameToken("blah", "blah", PasswordOption.SendPlainText));

これは、Studio2008でWSE3.0を実行するために過去に行ったことです。お役に立てば幸いです。

于 2010-01-26T13:06:32.077 に答える
12

残念ながら、wsanvilleのすばらしい答えを読む前に、うまくいきました。

他の人を助けるために、VisualStudio2005で動作させるために必要なすべての手順を投稿します。

  • WSE 3.0をインストールし、カスタムを選択してすべてを選択します
  • ヒントについては、WSE3.0でのユーザー名トークンを使用した直接認証の実装をお読みください。
  • Visual Studio 2005を再起動し、ソリューションエクスプローラーでプロジェクトを右クリックすると、WSE設定3.0メニュー項目が表示され、必要に応じてそれを使用できます。
  • Web参照を更新します。これにより、新しいHTTPWebサービスプロキシクラスが別の名前で作成されますYourWsNameHttpServiceWse。これは、基本的にwsewsdl3.exeを実行するのと同じです。
  • この新しいクラスを使用すると、などのWSEメソッドとプロパティにアクセスできるはずですSetClientCredential

C#DLLで構築された構成ファイルに依存する代わりに、コードでほとんどすべてを実行することになりました。コードは次のようになりました。

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

wse.SetClientCredential(new UsernameToken(
    "username",
    "password",
    PasswordOption.SendPlainText));

wse.SetPolicy(new FooBarPolicy());
wse.CallSomeServerFunction(yourRequest)

次のような独自のポリシーを作成しました。

using Microsoft.Web.Services3.Design;

// ...

public class FooBarPolicy : Policy
{
    public FooBarPolicy()
    {
        this.Assertions.Add(new UsernameOverTransportAssertion());
    }
}

最後に、WebSphereサーバーは、メッセージアドレス指定プロパティを表す必須ヘッダーが存在しないと応答し、送信メッセージを検査しました(NiceツールFiddlerを使用)。サーバーからのSOAP障害が、アクションヘッダーが欠落していることを示していました。

wsa:Action私は自分で要素を設定しようとしても無駄でした:

using Microsoft.Web.Services3.Addressing;

// ...

wse.RequestSoapContext.Addressing.Action = new Action("CallSomeServerFunction");

問題は、アクションを設定しても、それが有線で送信されたときに空であったことでした。WSEプロキシクラスを開いて、そこで属性を編集する必要があることがわかりました。

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
    "---Edit this to set wsa:Action---", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
    ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
// ...
public SomeServerFunction(...)

その後、すべてうまくいきました。

于 2010-01-26T14:41:55.150 に答える