1

次の問題があります。WCFサービスを実行するマシンがあります。このサービスは次のように構成されています。

<system.web>
  <authentication mode="Windows" />
</system.web>
<system.serviceModel>
  <client />
  <services>
    <service name="AnchorWcfService.AnchorService" behaviorConfiguration="serviceBehavior">
      <endpoint address="AnchorService" contract="AnchorWcfService.IAnchorService" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" />
      <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" />
    </service>
  </services>
  <bindings>
    <wsHttpBinding>
      <binding name="TransportSecurity" maxReceivedMessageSize="5000000">
        <readerQuotas maxStringContentLength="5000000" maxDepth="128" maxArrayLength="5000000" />
        <security mode="Transport">
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="serviceBehavior">
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceMetadata httpsGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

このサービスはHTTPSを使用するように設定されており、netshコマンドラインツールを使用して必要なテスト証明書を追加しました。次の方法で証明書を作成しました。

まず、このコマンドを自分のマシンで実行して、ルート証明書を作成しました

makecert -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.cer

次に、cerファイルをwcfサービスをホストしているマシンとWebサーバーの両方にコピーし、mmcを使用してインポートしました。

次に、wcfサービスをホストしているマシンで、追加のコマンドを実行しました。

makecert -sk MyWcfService -iv RootCATest.pvk -n "CN=1.2.3.4" -ic RootCATest.cer -sr localmachine -ss my -sky exchange -pe 

ここで、1.2.3.4はwcfサービスをホストしているマシンのIPです。

次に、次のようなSSL証明書を作成しました。

netsh http add sslcert ipport=0.0.0.0:8080 certhash=<Thumbprint from the sertificate created in the last step> appid={00112233-4455-6677-8899-AABBCCDDEEFF}

wcftestclientWebサーバーマシンから、作成した別の.NETコンソールアプリケーションと両方を使用して、このサービスに正常に接続しました。

問題は、Webアプリケーションから接続しようとしたときです。コンソールアプリケーションとWebアプリケーションでまったく同じコードを使用して、WCFサービスを使用します。

IAnchorService channel = null;
var binding = new WSHttpBinding(SecurityMode.Transport);
var channel = ChannelFactory<IAnchorService>.CreateChannel(binding, endpoint.Address);
var anchor = channel.GetAnchorDetails();

コンソールアプリケーションでは、最後の行がwcfサービスからアンカーの詳細を正常に取得しますが、Webアプリケーションでは、次の例外が発生します。

System.ServiceModel.Security.MessageSecurityException: The HTTP request was forbidden with client authentication scheme 'Negotiate'. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.

また、Security.Transportを削除し、クライアントとサーバーの両方でSecurity.Noneを設定することもテストしました(したがって、HTTPSの代わりに通常のHTTPを使用します)。その後、すべてが正常に機能します。

また、サービスをWebサーバーと同じマシンに配置しても、HTTPSを使用すると、機能します。

したがって、Webサーバーとwcfサービスが別々のマシンで実行され、SSLが有効になっている場合にのみ失敗します。

私は今思いつくことができるすべてを試しました。これをWebアプリケーションで機能させるには、何をする必要がありますか?

4

0 に答える 0