客户端身份验证方案“匿名”禁止HTTP请求。 3

时间:2014-06-02 11:57:06

标签: c# .net wcf

我使用wcf在https上实现相互握手,但收到错误: " HTTP请求被禁止使用客户端身份验证方案' Anonymous'。"

服务代码:

        var binding = new BasicHttpBinding()
        {
            Security =
            {
                Mode = BasicHttpSecurityMode.Transport,
                Transport = { ClientCredentialType = HttpClientCredentialType.Certificate },
            },
        };

        var sh = new ServiceHost(typeof(EchoService), new Uri("https://localhost:9876"));
        //sh.Description.Behaviors.Add(new ServiceMetadataBehavior());
        //sh.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
        sh.AddServiceEndpoint(typeof(IEchoService), binding, "");
        sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        sh.Open();

客户代码:

        var binding = new BasicHttpBinding()
        {
            Security =
            {
                Mode = BasicHttpSecurityMode.Transport,
                Transport = { ClientCredentialType = HttpClientCredentialType.Certificate },
            },
        };

        var sslClientFactory = new ChannelFactory<IEchoService>(binding, "https://localhost:9876");
        sslClientFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        var sslClient = sslClientFactory.CreateChannel();
        var response = sslClient.Echo("Https Echo");

我已使用httpcfg将此证书分配给端口。

如果我将BasicHttpBinding的绑定更改为NetTcpBinding,则可以正常工作。

如果我运行两个服务实例(在一个进程中),一个使用NetTcpBinding,第二个使用BasicHttpBinding,并从net tcp客户端和https客户端使用它,两者都可以正常工作(客户端使用相同的证书)。

如果我只运行我的https客户端,我会得到什么情况&#34; HTTP请求被禁止使用客户端身份验证方案&#39; Anonymous&#39;。&#34;?

1 个答案:

答案 0 :(得分:0)

我注意到我有很多加倍的证书(一对两个相同的证书 - 具有相同的thumbrpint)在商店(我不知道我是如何将它们放在那里),我认为这是一个问题。也许当证书在商店中加倍时,服务器只向那些发行者发送未加倍的证书?