2

さて、私はこの問題に関連するいくつかの質問を見てきました、そして私はそれらに提示された多くのアイデアを試しましたが成功しませんでした。これが私の状況です:

会社のイントラネットを介して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を実行している開発マシンには、証明書がインポートされています。

4

3 に答える 3

3

2つのばかげた質問:

  • 証明書がインストールされています
  • これは、このステージングマシン専用の証明書ですか?

また、最初にユーザー名/パスワードを設定し、次にクレデンシャルも設定するのは少し奇妙に思えます。ユーザー名/パスワードの部分をコメントアウトできますか?それは何か違いがありますか?

マーク

于 2009-07-15T21:04:20.530 に答える
2

証明書がローカルマシンストアにインポートされていることを確認してください。CurrentUserストアにある可能性があります。

于 2009-07-15T21:08:45.123 に答える
1

これはばかげているように聞こえるかもしれませんが、ステージングサービスの新しい証明書が証明書ストアにインストールされていることを確認しますか?それがおそらくあなたの問題です。

また、どの例外がスローされるかについて言及しなかったため、バインディングがユーザー名/パスワードの使用を示していない場合、clientcertificateクレデンシャルを設定する前にユーザー名/パスワードのクレデンシャルを設定したことが問題である可能性があります。そこで問題になる可能性があります。それらは相互に排他的です、IIRC。

于 2009-07-15T21:04:57.283 に答える