好的,我已经看到了与此问题相关的几个问题,并且我尝试了很多其中提出的想法,但没有成功。这是我的情况:
我正在通过我公司的 Intranet 访问 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 的开发机器已导入证书。