2

C# で SSL で保護された Web サービスを使用したいと考えています。リクエストは次のようになります。

<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:biw="http://tempuri.org/ws_returnTable"
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
  >
  <soapenv:Header>
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>sasdemo</wsse:Username>
        <wsse:Password>sasch.111</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </soapenv:Header>
   <soapenv:Body>
      <biw:meansclass />
   </soapenv:Body>
</soapenv:Envelope> 

WSDL のエンドポイント宣言は次のようになります。

<wsdl:service name="meansclass">
  <wsdl:port binding="tns:meansclassSoapBinding" name="meansclassPort">
    <soap:address location="https://sas.ssz.intra.stzh.ch:8443/SASBIWS/services/Shared%20Data/ws/meansclass" /> 
  </wsdl:port>
</wsdl:service>

app.config は次のようになります。

<bindings>
    <basicHttpBinding>
        <binding name="meansclassSoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <security mode="Transport">
                <transport clientCredentialType="None" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>
<client>
    <endpoint address="https://localhost:8443/SASBIWS/services/Shared%20Data/ws/meansclass"
        binding="basicHttpBinding" bindingConfiguration="meansclassSoapBinding"
        contract="ServiceReference1.meansclassPortType" name="meansclassPort" />
</client>

その C# コードを使用して Web サービスにアクセスしようとしました。

var service = new meansclassPortTypeClient();

service.ClientCredentials.UserName.UserName = "username";
service.ClientCredentials.UserName.Password = "password";

var test = service.meansclass();

しかし、常に meansclass() によってスローされる例外があります。ドイツ語では次のように言います。

タイプ「クライアント認証」の例外 (...) セキュリティ コンテキストがありません。

私はたくさんグーグルで検索しましたが、何が間違っているのかわかりません。そのような「セキュリティコンテキスト」を作成するにはどうすればよいですか? それとも何が悪いのですか?

4

1 に答える 1

0

追加のコンテキスト(WSDLのビュー)なしで私は把握していますが、SSLセキュリティとWebサービスセキュリティを混同していて、サービスがSOAPヘッダーの予期しないクレデンシャルについて不平を言っている可能性があります。

SSLセキュリティは、Webサービスの要求と応答を転送するプロセスの一部として適用されます。SSLの相互作用を調整するための要件は、C#で使用されているトラストストアに証明書をプルすることにより、クライアントがサーバーの証明書を信頼することです。

リクエストに表示されるのは、「メッセージレベル」のwss(Webサービスセキュリティ)ユーザー名/パスワードクレデンシャルです。

提案:

  1. サービスの実装を管理している場合は、セキュリティポリシーがWebサービスから削除されていることを確認してください。そうしない場合で、サービスの利用にユーザー名とパスワードが必要かどうか確信が持てない場合は、soapヘッダーからユーザー名とパスワードを削除してください。
  2. ここでも、サービスの実装を制御できる場合は、SSL要件を削除し、サービスを実行して、セキュリティで保護されていない(http)接続を介してサービスを呼び出すことができるかどうかを確認してください。
  3. SSLだけを追加し直して、例外を確認します...サーバーの公開証明書は、C#が実行されているコンテキストによって信頼されている必要があることに注意してください。証明書は通常、ブラウザでWebサービス(https)アドレスにアクセスし、ブラウザのメカニズムを使用して証明書を適切なトラストストア(http://balajiramesh.wordpress.com/2007/12/28/save )に保存することで取得できます。 -ssl-certificate-to-cer-file /
于 2012-05-08T03:13:11.943 に答える