5

Windows資格情報を使用する必要がある魔女を消費するWebサービス(ASMX)が与えられました。

そこで、クライアント VPN をセットアップして WSDL を呼び出し、XML ファイルとして保存し、.xml を使用してプロキシ クラスを生成しましたsvcutil.exe

私はサービスを次のように呼び出しています

// Web Service
client = new CmListSync.Models.WebCorePlayersSoapClient();
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(cUser, cPass, cDoma);

そして、web.config私はこのセットアップを持っています:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WebCorePlayersSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
          <security mode="None">
            <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
            <message clientCredentialType="Windows" algorithmSuite="Default" negotiateServiceCredential="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://vm-wssrv01/players.asmx" binding="wsHttpBinding"
        bindingConfiguration="WebCorePlayersSoap" contract="WebCorePlayersSoap"
        name="WebCorePlayersSoap" />
    </client>
  </system.serviceModel>

しかし、サービスを呼び出そうとすると、次のような例外が発生します。

HTTP 要求は、クライアント認証スキーム「匿名」では許可されていません。サーバーから受信した認証ヘッダーは「Basic realm=\"vm-wssrv01\"」でした。

私は何が欠けていますか?Windows資格情報を提供したので、サービスは正常に認証されるべきではありませんか? これ以上何をすればいいですか?

私が試したこと:

  • セキュリティモードをに設定するMessageと、上記の質問と同じエラーが発生しました
  • セキュリティ モードTransportWithMessageCredentialI got: The provided URI scheme 'http' is invalid; に設定します。'https' が必要です。\r\nパラメータ名: via
  • セキュリティ モードを に設定するTransport、WSHttpBinding がトランスポート セキュリティ (HTTPS) を介した信頼できるセッションをサポートしていないため、バインディングの検証に失敗しました。チャネル ファクトリまたはサービス ホストを開くことができませんでした。HTTP を介した安全で信頼性の高いメッセージングには、メッセージ セキュリティを使用します。

ジョン・サンダースのコメントから:

に切り替えましたbasicHttpBinding

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="WebCorePlayersSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="Windows" proxyCredentialType="Windows" realm="vm-wssrv01" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://vm-wssrv01/players.asmx" binding="basicHttpBinding"
        bindingConfiguration="WebCorePlayersSoap" contract="WebCorePlayersSoap"
        name="WebCorePlayersSoap" />
    </client>
  </system.serviceModel>

securityモードを次のように変更しようとしました:

  • TransportWithMessageCredential {"指定された URI スキーム 'http' は無効です。'https' が必要です。\r\nパラメータ名: via"}

  • TransportCredentialOnly {"HTTP 要求は、クライアント認証スキーム「ネゴシエート」では許可されていません。サーバーから受信した認証ヘッダーは、「基本レルム =\"vm-wssrv01\"' でした。」}

  • Message {"BasicHttp バインディングでは、BasicHttpBinding.Security.Message.ClientCredentialType が、安全なメッセージの BasicHttpMessageCredentialType.Certificate 資格情報タイプと同等である必要があります。UserName 資格情報には、Transport または TransportWithMessageCredential セキュリティを選択してください。"}

  • Transport {"指定された URI スキーム 'http' は無効です。'https' が必要です。\r\nパラメータ名: via"}

  • None {"HTTP リクエストは、クライアント認証スキーム「匿名」では許可されていません。サーバーから受信した認証ヘッダーは、「基本レルム =\"vm-wssrv01\"' でした。」}

私はアイデアを使い果たしています:(サービスはHTTPのみであり、HTTPSではなく、使用する証明書がありません...

4

1 に答える 1

5

3 日後、John Saundersの大きな助けを得て、ASMX サービスの唯一の可能なバインディングは次のとおりであると述べましたbasicHttpBinding(回答の検索がより集中し始めました)。

サービスの呼び出し元では、次のclient.ClientCredentials.UserNameように使用する必要があります。

// Web Service
client = new CmListSync.Models.WebCorePlayersSoapClient();
client.ClientCredentials.UserName.UserName = cUser;
client.ClientCredentials.UserName.Password = cPass;

構成部分では、次を使用する必要があります。

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="WebCorePlayersSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://vm-wssrv01/players.asmx" binding="basicHttpBinding"
        bindingConfiguration="WebCorePlayersSoap" contract="WebCorePlayersSoap"
        name="WebCorePlayersSoap">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
于 2013-01-10T20:18:16.620 に答える