Аутентификация WCF для IPC и удаленного доступа - PullRequest
5 голосов
/ 25 ноября 2010

Мое приложение с графическим интерфейсом контролирует свою сестринскую службу Windows, используя WCF NetNamedPipeBinding.Я хочу, чтобы другие приложения не олицетворяли мое приложение с графическим интерфейсом и управляли моей службой.

Необходимо ли проверять подлинность приложения с графическим интерфейсом в службе Windows для предотвращения олицетворения?
И как мне это делать?


Редактировать: Удаленные компьютеры также должны иметь возможность контролировать службу, если они аутентифицированы (доверены службой), поэтому мне нужно добавить конечную точку NetTcpBinding.Любой ответ, который также включает это, был бы полезен.

1 Ответ

2 голосов
/ 25 ноября 2010

Да, необходимо защитить канал 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.
...