17

私の質問はこれに似ています。WSDLでSoapヘッダーが定義されていない場合にSoapヘッダーを渡す方法は?しかし、違います。

私が使用するWebサービスの場合、すべてのメソッドには、SOAPヘッダー内にクリアテキストで送信される認証が必要です。ただし、私のWSDLにはsoapヘッダー情報が含まれていません。WSDLからコードを生成するために使用する必要があるカスタムプラットフォームツールがあります。ヘッダー情報が利用できないため、生成されたクラスを直接使用できません-ヘッダーに対応するようにコードを手動で変更したくありません。

WSDLでSOAPヘッダーを指定しようとしましたが、正しい名前空間を取得できませんでした。WSDLはhttps://stage.totalcheck.sensis.com.au/service/webservice?wsdlにあり、SOAPヘッダーは次のとおりです。

    <soapenv:Header>
        <wsse:Security>
            <wsse:UsernameToken>
                <wsse:Username>username</wsse:Username>
                <wsse:Password>password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
   </soapenv:Header>

誰かが私を助けることができますか?ありがとう!

4

3 に答える 3

19

概念的な観点から、WSDLはヘッダーを定義することは想定されていません。WSDLは、操作、メッセージ、バインディング、エンドポイントなど、サービスの機能面を定義するためだけのものです。メッセージとバインディングは、メッセージのペイロードをエンコードおよびフォーマットする方法を定義します。

ただし、SOAPメッセージのヘッダーはペイロードに属していません。これらは通常、SOAPプロセッサの非機能プロパティを構成するために使用されます。セキュリティはそのような非機能的な特性です。ペイロードの機能面は影響を受けません。通信が保護されていることが保証されているだけであり、サービスの実装ではなく、WSツールスタックがそれを処理する必要があります。

したがって、欠落している部分は、WSDLサービスにいくつかの非機能要件を付加できるようにする標準になりました。これにより、コードジェネレーターは、必要に応じて非機能プロパティを満たすために送信および/または理解する必要のあるヘッダーを自動的に導出できます。 -ヘッダーフィールドを手動で処理する必要はありません。この標準は存在し、 WS-Policyと呼ばれます。ポリシーには通常、プロバイダーとコンシューマーの両方が満たすことができる必要がある一連の要件を公開する一連の代替案が含まれています。2つのサービスが相互作用することになっている場合、両方のポリシーが採用され、いわゆる「有効なポリシー」が計算されます。これは、一般的な非機能要件を定義します。この情報を使用して、プロバイダーとコンシューマーは、WS-Securityヘッダーなどの必要なヘッダーを追加するように構成できます。WS-SecurityPolicyは、使用できる一連のポリシーも定義します。WS-PolicyAttachmentは、そのようなポリシーをWSDLにアタッチする方法を定義します。

メトロやAxis2などのWS-Policiesを処理できるコードジェネレーターがあります

于 2011-04-21T08:41:38.580 に答える
4

wsdlから生成されたプロキシクラスのメソッドをSoapHeader属性で修飾することにより、soapヘッダー情報をメソッド呼び出しに追加できます。

たとえば、「Web参照の追加」を行うと、wsdl.exeはWebサービス参照用のクライアントプロキシクラスReference.csを生成します。上記のリンクhttps://stage.totalcheck.sensis.com.au/service/webservice?wsdl に、Webを追加するときに生成されたreference.csクライアントプロキシコードファイルのメソッドに変換されるメッセージsuggestAddressがあります。 VisualStudioからの参照。デフォルトでは、このメソッドが呼び出されると、soapエンベロープにヘッダーはありません。このリクエストのエンベロープにSoapHeaderを追加するには、Reference.csで生成されたクラスのSuggestAddressメソッドの先頭に[SoapHeader( "Security")]属性を追加します。ここで、"Security"はSoapHeader基本クラスから継承するクラスです。

上記の必須のセキュリティSoapHeaderの例では、次のクラスを作成します。

public partial class Security : SoapHeader
{
    public UserNameToken UserNameToken { get; set; }
}

public partial class UserNameToken
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

次に、reference.csのSuggestAddressメソッドを次のように装飾します。

[SoapHeader("Security")]
public suggestAddressesResult suggestAddresses([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] addressSearch search) {
        object[] results = this.Invoke("suggestAddresses", new object[] {search});
        return ((suggestAddressesResult)(results[0]));
    }

これにより、メソッドsuggestAddressが呼び出されたときに作成されるすべてのエンベロープに、上記のようなセキュリティヘッダーが含まれるようになります。

<soapenv:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>username</wsse:Username>
            <wsse:Password>password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>

于 2012-10-06T04:45:53.277 に答える
1

この質問を使用して自分自身を助けるための鍵は、問題のヘッダーがWS-Security標準のヘッダーであることを(一部の人が指摘しているように)認識することでした。

プロキシ生成ツールが「カスタム」の場合、WS-Securityのヘッダーを自動的に追加するスイッチがあるのは当然のことと思われます。ただし、WSDL.exe(Visual Studioの「Web参照の追加」)を使用している場合は、svcutil.exe代わりに(「サービス参照の追加」)を検討してください。

WCFプロキシを使用する場合は、指定された構成をオーバーライドして、WCFがヘッダーを追加できるようにすることができます。

<security mode="TransportWithMessageCredential">
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

そこから、パスワードを指定できます。

RemoteSvcProxy.TheirClient client = new RemoteSvcProxy.TheirClient();
client.ClientCredentials.UserName.UserName = "uname";
client.ClientCredentials.UserName.Password = "pwd";

カスタムツールが何であるかはわかりませんが、おそらくそれが基づいているフレームワークにも同様の構成オプションがあります。

于 2012-10-16T23:02:14.227 に答える