Как я могу зашифровать, но не защищенные сообщения WCF? - PullRequest
2 голосов
/ 25 августа 2011

Я создал приложение, в котором машины общаются друг с другом по сети.Я хотел бы использовать NetTCPBinding и шифровать сообщения.Однако я не хочу или не нуждаюсь в сертификатах или аутентификации Windows.Я пытаюсь установить для режима безопасности «Сообщение», чтобы получить шифрование и безопасность транспорта, чтобы избежать проверки подлинности сертификатов / Windows, но все равно получаю:

System.ServiceModel.Security.SecurityNegotiationException: вызывающий не былаутентифицируется службой.---> System.ServiceModel.FaultException: запрос токена безопасности не может быть выполнен из-за сбоя аутентификации.

Вот соответствующий код:

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;

Ответы [ 2 ]

4 голосов
/ 27 августа 2011

Ответ на этот вопрос работает: wcf сервер selfhosting - загрузить сертификат из файла вместо хранилища сертификатов

Мой код:

var certificate = new X509Certificate2("cert.pfx", "");

host = new ServiceHost(MessageProvider, address);
host.Credentials.ServiceCertificate.Certificate = certificate;
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
host.AddServiceEndpoint(typeof(IService), binding, address);
host.Open();
1 голос
/ 25 августа 2011

Я думаю, это то, что вы ищете: Защита сообщений с анонимным клиентом . Я полагаю, что проблема в вашем случае заключается в том, что ваша служба не указывает сертификат на стороне сервера:

Первоначальное согласование требует аутентификации сервера, но не аутентификации клиента

Так что при создании экземпляра службы попытайтесь сделать что-то вроде (из MSDN):

myServiceHost.Credentials.ServiceCertificate.SetCertificate(
     StoreLocation.LocalMachine,
     StoreName.My,
     X509FindType.FindByThumbprint,
     "00000000000000000000000000000000");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...