C #: ограничить удаленное взаимодействие .Net только для локальных подключений - PullRequest
3 голосов
/ 08 октября 2009

Я использую .Net Remoting для обработки внутрипроцессного взаимодействия между главной службой и многочисленными (иногда более 50) экземплярами небольшой клиентской библиотеки. С точки зрения безопасности крайне важно, чтобы служба принимала соединения только с локального компьютера, и никто другой - пока я не могу найти никакой информации о том, как это сделать, и документы MSDN, похоже, не сильно помогают. 1001 *

Предпочтительно, я бы хотел, чтобы соединения были привязаны к localhost таким образом, чтобы не отключать предупреждения пользователей брандмауэра ... но это не является обязательной функциональностью.

Спасибо за помощь!

Tom

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Я сам наткнулся на это, изучая документацию IpcChannel.

Проблема с IpcChannel заключается в том, что именованные каналы Windows не работают правильно под UAC, когда клиент работает как процесс с низким уровнем целостности. К сожалению, поскольку я работаю над плагином, а не над полным приложением, низкая целостность хоста плагина означает вызов связки Win32 API, включая некоторые новые, специфичные для Vista, и программную настройку ACL токенов приложений, что я действительно не хочу делать.

К счастью, некоторые из перегруженных форм RegisterChannel () позволяют вам указывать опции в объекте Hashtable System.Collections.IDictionary, некоторые из них связаны с безопасностью и обработкой удаленных соединений. Больше информации здесь:

http://msdn.microsoft.com/en-us/library/bb187434%28VS.85%29.aspx

Я закончил тем, что вернул свой код обратно к реализации TcpChannel и изменил некоторые вещи на сервере, и он прекрасно работает. Никакого пота!

            System.Collections.IDictionary sProperties = new System.Collections.Hashtable();

        sProperties["port"] = SERVER_PORT;
        sProperties["authorizedGroup"] = "INTERACTIVE";
        sProperties["rejectRemoteRequests"] = true;

        BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();

        TcpServerChannel channel = new TcpServerChannel(sProperties, serverProvider);   
        ChannelServices.RegisterChannel(channel, false);

Извините, что забрал ваш ответ, но я наткнулся на то, что точно отвечает на мой вопрос.

Том

2 голосов
/ 08 октября 2009

Используйте IpcChannel, если вы используете .NET 2.0+. Он предназначен для межпроцессного взаимодействия и вообще не использует TCP.

...