石鹸の追加:WSE 3.0を使用したヘッダーユーザー名とパスワード
-
22-09-2019 - |
質問
認証を使用しないときに正しく機能するWSクライアントを正常に作成しました。
ただし、サーバー(WebSphere)はWSセキュリティユーザー名トークンを追加する必要があり、これを行うのに苦労しています。結果の石鹸メッセージは、次のように見えるはずです:
<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
, 、しかし、これまでのところ、私は何も立ち上げて実行することができませんでした。
私はネット上で良いレシピを見つけることができないように見えるので、どんなヒントも大歓迎です。
ありがとう!
解決 2
残念ながら読む前に、それを機能させました Wsanvilleの素晴らしい答え.
他の人を助けるために、Visual Studio 2005で動作させるために必要なすべての手順を投稿しています。
- インストール WSE 3.0, 、 選ぶ 習慣 すべてを選択します
- 読んだ WSE 3.0のユーザー名トークンを使用して直接認証を実装します ヒントのために
- Visual Studio 2005をリニューアルし、ソリューションエクスプローラーでプロジェクトを右クリックすると、 WSE設定3.0 メニュー項目を使用して、必要に応じて使用します。
- Webリファレンスを更新すると、これは別の名前で新しいHTTP Web Serviceプロキシクラスを作成する必要があります。
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サーバーはそれに応答しました プロパティアドレス指定のメッセージを表す必要なヘッダーは存在しません, 、および発信メッセージの検査(素敵なツールを使用して フィドラー)サーバーからの石鹸断層が、アクションヘッダーが欠落していることを示したのを見ました。
私はそれを設定するために無駄に試みました 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(...)
その後、それはすべてうまくいきました。
他のヒント
プロキシクラスが継承されていることを確認してください 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));
これは、WSE3.0をStudio2008で獲得するために過去に行ったことです。それが役立つことを願っています。