WCF - 无法使用以下搜索条件查找x.509证书

时间:2009-07-15 21:00:36

标签: wcf wcf-security wcf-client

好的,我已经看到了几个与此问题相关的问题,我已经尝试了很多其中提出的想法并没有成功。这是我的情况:

我正在通过我公司的内联网上网络服务。我使用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,并将它们与cert上的值相匹配但没有成功。我的代码有问题吗?有没有其他方法可以查询证书库以验证我传递的值?

运行Visual Studio的开发计算机已导入证书。

3 个答案:

答案 0 :(得分:3)

两个愚蠢的问题:

  • 确定您的证书是否已安装?
  • 这是一个专门为这台升降机提供的证书吗?

此外,您首先设置用户名/密码,然后还设置凭据似乎有点奇怪。你可以注释掉用户名/密码部分吗?这有什么不同吗?

马克

答案 1 :(得分:2)

您确定证书已导入本地计算机商店,它可能位于CurrentUser商店中。

答案 2 :(得分:1)

这可能听起来很愚蠢,但您确定登录服务的新证书已安装到您的证书库中吗?这很可能是你的问题。

此外,由于您没有提到引发的异常,因此问题可能是您在设置clientcertificate凭据之前设置了用户名/密码凭据,此时绑定未指示使用用户名/密码。可能是一个问题;他们是互相排斥的,IIRC。