さて、私はこの問題に関連するいくつかの質問を見てきました、そして私はそれらに提示された多くのアイデアを試しましたが成功しませんでした。これが私の状況です:
会社のイントラネットを介してWebサービスを利用しています。svcutil.exeを使用して、WCFのクライアントクラスを生成しました。サービスの開発中に問題なくWebサービス呼び出しを実行でき、認証資格情報を必要としなかったため、コードが機能することがわかりました。当時、コードはSSLを介して実行されていました。必要な証明書を信頼されたルート証明機関ストアにインポートしましたが、すべて問題ありませんでした。
ステージ環境に移行したばかりで、接続するために資格情報が必要になるようにサービスがアップグレードされました。接続を新しいエンドポイントに切り替え、認証するコードを追加しました。wcfを使用するのはこれが初めてですので、明らかな間違いがあればご容赦ください。私の問題は、認証のためにサービスに渡すコードを介して証明書を見つけることができないことです。私はこれを私が見つけたいくつかのオンラインコード例に基づいています。
svcutilによって生成された構成の例を次に示します。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding
name="xxxSOAPBinding"
.... (irrelevant config settings)....
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://xxxServices_1_0_0"
binding="basicHttpBinding" bindingConfiguration="xxxSOAPBinding"
contract="xxxService" name="xxxService" />
</client>
</system.serviceModel>
そして、これが私が接続を試みるために使用しているコードです。証明書を見つけようとするとすぐに例外がスローされます。
using (var svc = new xxxServiceClient())
{
svc.ClientCredentials.UserName.UserName = "XXX";
svc.ClientCredentials.UserName.Password = "XXX";
svc.ClientCredentials.ClientCertificate
.SetCertificate(StoreLocation.LocalMachine, StoreName.Root,
X509FindType.FindBySubjectName, "xxx");
...
}
私はいくつかの異なるX509FindTypesを試しましたが、それらを証明書の値と一致させましたが、成功しませんでした。私のコードに何か問題がありますか?渡した値を検証するために証明書ストアにクエリを実行する別の方法はありますか?
Visual Studioを実行している開発マシンには、証明書がインポートされています。