具有证书身份验证的WCF自托管服务

时间:2013-04-13 21:26:24

标签: wcf rest authentication certificate

我创建了一个自托管WCF RESTful服务,其基本http身份验证通过https运行,并带有自签名SSL证书。一切正常。当用户通过Web浏览器访问服务操作时,会弹出一个要求提供凭据(登录/密码)的内容。

现在我想进行证书身份验证而不是基本身份验证,但它不起作用。客户端的浏览器(IE / chrome / firefox)从不提示选择证书,我总是收到HTTP 403错误,当我在自定义证书验证器中设置断点时,它永远不会出现。所以我肯定在这里遗漏了一些东西。我尝试使用Fiddler进行调试,并确认请求中没有身份验证标头。

这是我托管服务的代码。

Uri baseAdress = new Uri("https://localhost:8446/"); 
WebServiceHost host = new WebServiceHost(typeof(RestService));
WebHttpBinding wb = new WebHttpBinding();
wb.Security.Mode = WebHttpSecurityMode.Transport;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
host.AddServiceEndpoint(typeof(IRestService), wb, baseAdress);
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = 
X509CertificateValidationMode.Custom;
host.Credentials.ClientCertificate.Authentication.CustomCertificateValidator = 
new MyX509CertificateValidator()
host.Open();

感谢您的任何提示。

2 个答案:

答案 0 :(得分:1)

我发现这篇文章可能会对您有所帮助:http://blogs.msdn.com/b/james_osbornes_blog/archive/2010/12/10/selfhosting-a-wcf-service-over-https.aspx

它讨论了某种将证书注册到netsh,..

此外,请确保您的证书已颁发给localhost(因为您调用的网址中的域名部分应该与证书相同。发布到。)

答案 1 :(得分:1)

感谢您的投入。 我发现了什么问题。

当我使用makecert工具为ssl端口绑定创建自签名证书时,我添加了“-eku”密钥,该密钥使证书用于服务器身份验证。我重新创建了另一个没有该选项的,所以它可以用于所有目的。

此外,我确保我的证书在当前用户的个人存储中。 在此之后,当客户端输入我的服务的URL时,会弹出一个要求他们选择证书的弹出窗口,并且有一个我创建的证书。

对于那些面临同样问题的人来说,这个post可能会有用。