Да, необходимо защитить канал WCF, чтобы предотвратить олицетворение. WCF может автоматически шифровать ваши сообщения, когда вы указываете это, но вам нужно самостоятельно обработать часть аутентификации.
Существует два метода защиты сообщений в WCF (три, если учесть тот факт, что вы можете использовать оба из них одновременно). Здесь есть хорошее объяснение высокого уровня здесь . Какой из этих методов вы можете использовать , зависит от того, о какой привязке мы говорим (у вас будут разные варианты для разных привязок).
Кроме того, для каждого метода защиты службы у вас будет выбор между типами учетных данных для аутентификации (фактическое средство, с помощью которого каждый объект будет доказывать свою идентичность другой конечной точке). Это зависит от привязки, а также от метода безопасности .
Чтобы узнать, какие параметры доступны для каждой привязки, вы можете проверить ее свойство Security
. Это свойство имеет различный тип для каждой привязки (например, NetTcpSecurity
); Вы можете проверить MSDN или IntelliSense, чтобы узнать это.
Теперь я буду использовать NetTcpBinding
с транспортной безопасностью в качестве примера.
Чтобы настроить безопасность как на серверной, так и на клиентской части, сначала необходимо настроить привязку с режимом безопасности и типом аутентификации перед созданием и открытием канала, например ::
var binding = new NetTcpBinding { /* set props here */ };
// TLS security with X.509 certificates
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
Затем на стороне сервера (этот пример относится к выбору, сделанному выше):
// Load and set the server certificate
var serverCertificate = new X509Certificate2(/* parameters here */);
host.Credentials.ServiceCertificate.Certificate = serverCertificate;
// You can leave it at that and let Windows validate the client's certificate using
// the default method (which means that you either need to have added the client's
// certificate to the server machine's certificate store as "trusted", or rely on chain
// trust and have the client's certificate signed by a trusted authority.
// Or, you can use custom validation rules:
var authentication = host.Credentials.ClientCertificate.Authentication;
authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
authentication.CustomCertificateValidator = new AcceptAnythingCertificateValidator();
И на стороне клиента (этот пример также специфичен):
var clientCertificate = new X509Certificate2(/* parameters here */);
var factory = new ChannelFactory<IYourServiceInterface>(binding, endpoint);
factory.Credentials.ClientCertificate.Certificate = clientCertificate;
// You can leave it at that and let Windows validate the server's certificate using
// the default method (which means that you either need to have added the server's
// certificate to the client machine's certificate store as "trusted", or rely on chain
// trust and have the server's certificate signed by a trusted authority.
// Or, you can use custom validation rules:
var authentication = factory.Credentials.ServiceCertificate.Authentication;
authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
authentication.CustomCertificateValidator = new AcceptAnythingCertificateValidator();
var channel = factory.CreateChannel();
// Your channel is now ready for use! You can also cast to to IClientChannel
// to expose some more properties.