我在让 WCF 客户端连接到需要客户端证书和用户名/密码的服务器时遇到问题。
我已经验证了使用 JUST 客户端证书可以使用这个:
var binding = new WSHttpBinding(SecurityMode.Transport);
binding.Security.Transport = new HttpTransportSecurity();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var ea = new EndpointAddress(EndpointUrl);
using (var p = new ServiceReference1.AAAClient(binding, ea))
{
try
{
p.ClientCredentials.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
CertificateSubject);
var x = p.RequiresClientCertificateOnly();
Console.WriteLine("Status: " + x.status);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
}
下一个合乎逻辑的步骤是添加用户名/密码部分,但它返回 403 unauthorized。我知道凭据和证书是有效的,因为我在中间使用了 fiddler 来提供客户端证书和用户名/密码,它工作正常,只是在通过 WCF 使用时它似乎不起作用,或者使用发送客户端证书和用户名/密码。
尝试同时使用两者的代码如下(尝试使用 WSHttpBinding 和 BasicHttpBinding - 两者的结果相同):
var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
var ea = new EndpointAddress(EndpointUrl);
using (var p = new ServiceReference1.PingPortTypeClient(binding, ea))
{
try
{
p.ClientCredentials.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
CertificateSubject);
p.ClientCredentials.UserName.UserName = Username;
p.ClientCredentials.UserName.Password = Password;
var x = p.pingDatabase();
Console.WriteLine("Status: " + x.status);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
当我直接在浏览器中访问 URL 时 - 我收到错误消息:
HTTP 错误 403.7 - 禁止您尝试访问的页面要求您的浏览器具有 Web 服务器可识别的安全套接字层 (SSL) 客户端证书。
这表明在上面的第二个示例中没有发送证书,因为它收到了相同的错误 (403)。
有人可以帮我配置 WCF 以提供客户端证书和用户名/密码吗?我在网上搜索过,这里的“类似问题”根本没有帮助。现在变得非常沮丧 - 我错过了什么?