次の問題があります。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}
wcftestclient
Webサーバーマシンから、作成した別の.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アプリケーションで機能させるには、何をする必要がありますか?