2013-04-15 2 views
0

У меня был внутренний интерфейс, который мне нужно было реализовать поверх удаленных .NET-узлов, чтобы обеспечить удаленную связь только с нашими сборками (используя InternalsVisibleTo для доступа к сборкам друзей). Однако, когда я реализовывал интерфейс и построил его, я получил следующее сообщение об ошибке:Реализация внутреннего интерфейса над .NET Remoting

'AssemblyName' does not implement interface member 'InterfaceMember1(...)' 'AssemblyName' cannot implement an interface because it is not public. 

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

Я обеспокоен отсутствием информации, которую я нашел на эту тему, особенно в MSDN и StackOverflow. Что-то не так с реализацией удаленной работы .NET над внутренним интерфейсом? И если да, то почему?

EDIT Вот что мой интерфейс и реализация выглядит следующим образом:

интерфейс

internal interface IAdmin 
{ 
    bool TESTPING(); 
    bool AdminTask1(int val); 
    ... 
} 

Реализация

public class RService : MarshalByRefObject, IAdmin 
{ 
    //IAdmin members 

    bool IAdmin.TESTPING() 
    { 
     return true; 
    } 

    bool IAdmin.AdminTask1(int val) 
    { 
     // do stuff 
     return true; 
    } 
} 

ответ

1

Вы не можете реализовать функцию безопасности таким образом. Спецификация Remoting открыта, поэтому любой может создать сообщение, отправить его удаленному классу и получить ответ. Ваш сервис не может надежно определить, кто его назвал.

Вы можете реализовать пользовательскую авторизацию и отправить секретный токен при каждом вызове метода, чтобы убедиться, что только ваш код вызывает его.

+0

Я уже делаю это в своем коде, я думал, что создание внутреннего интерфейса может добавить немного дополнительной безопасности, что кажется не так –

1

MSDN: http://msdn.microsoft.com/en-us/library/ms182313(VS.80).aspx

Interface methods have public accessibility, which cannot be changed by the implementing type. An internal interface creates a contract that is not intended to be implemented outside the assembly that defines the interface. A public type that implements a method of an internal interface using the virtual modifier allows the method to be overridden by a derived type that is outside the assembly. If a second type in the defining assembly calls the method and expects an internal-only contract, behavior might be compromised when, instead, the overridden method in the outside assembly is executed. This creates a security vulnerability.

+0

Не правда ли, что член интерфейса переопределен только true, если я пометить члены интерфейса как виртуальные? Я думал, что члены интерфейса были закрыты по умолчанию в .NET? Или я не понимаю уязвимость? –

+0

Интерфейс всегда абстрактный. В статье MSDN говорится о создании класса, который реализует интерфейс и устанавливает исполняемые элементы как виртуальные. И в вашем удаленном приложении вы наследуете новый класс. Но прежде чем делать это, я подумал бы об открытии интерфейса. –

 Смежные вопросы

  • Нет связанных вопросов^_^