Programmatic WCF Message Security with Certificates

Eu escrevi um serviço WCF auto-hospedado usando WSHttpBindings e estou tentando implementar a segurança no nível de mensagem usando certificados que eu mesmo gerei. Infelizmente, estou recebendo uma exceção oculta (por meio do Service Trace Viewer) informando "As credenciais fornecidas ao pacote não foram reconhecidas".

Um par de notas:

Isso deve ser feito no código, não na configuração Cert (Servidor / Cliente) são certificados que estão no armazenamento da máquina local com chaves privadas acessíveis ao meu usuário durante a depuraçã Eu pesquisei muito sobre isso e encontrei um bom recurso para configurar a segurança baseada em mensagens do WCFAqu

Não tenho certeza do que estou perdendo. A maioria dessas coisas parece direta, exceto pela criação das identidades dos pontos de extremidade. Ele falha com a mesma mensagem, se eu uso DnsEndpointIdentities, certificados ou com nenhuma identidad

Alguém pode me apontar na direção certa

Lado do servidor:

var binding = new WSHttpBinding
    {
      Security =
      {
        Mode = SecurityMode.Message,
        Message = 
        {
          ClientCredentialType = MessageCredentialType.Certificate,
          AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
        }
      }
    };

_host = new ServiceHost(this)
{
  Credentials =
  {
    ServiceCertificate =
    {
      Certificate = ServiceCert
    },
    ClientCertificate =
    {
      Certificate = ClientCert,
      Authentication =
      {
        TrustedStoreLocation = StoreLocation.LocalMachine,
        RevocationMode = X509RevocationMode.NoCheck,
        CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
       }
    }
  }
};
var address = new Uri(string.Format(@"http://serviceaddress"));
var ep = _host.AddServiceEndpoint(typeof (IService), binding, address);
ep.Address = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServiceCert));
_host.Open();

Lado do cliente:

var binding = new WSHttpBinding
    {
      Security =
      {
        Mode = SecurityMode.Message,
        Message =
        { 
          ClientCredentialType = MessageCredentialType.Certificate,
          AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
        }
      }
    };
var address = new Uri(@"http://serviceaddress");
var endpoint = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServerCert));
var channelFactory = new ChannelFactory<IService>(binding, endpoint)
    {
      Credentials =
      {
        ServiceCertificate =
        {
          DefaultCertificate = ServerCert,
          Authentication =
          {
            RevocationMode = X509RevocationMode.NoCheck,
            TrustedStoreLocation = StoreLocation.LocalMachine,
            CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
          }
        },
        ClientCertificate =
        {
          Certificate = ClientCert
        }
      }
    };
var channel = channelFactory.CreateChannel();

questionAnswers(1)

yourAnswerToTheQuestion