Как позвонить в Apache NMS из песочницы?

Я пытаюсь вызвать Apache ActiveMQ NMS Version 1.6.0 из моего кода ('IntPub'), который должен выполняться в изолированной программной среде в среде.NET 4.0 по соображениям безопасности. Программа, которая создает песочницу, делает мой код "частично доверенным" и, следовательно, "прозрачным для безопасности", что, по-видимому, означает, что она не может создать ConnectionFactory (см. Журнал ошибок ниже), потому что NMS кажется "критичным для безопасности". Вот код, который вызывает эту ошибку:

connecturi = new Uri("tcp://my.server.com:61616"); 
var connectionFactory = new ConnectionFactory(connecturi); 

Я также попробовал это вместо этого с похожими результатами:

connecturi = new Uri("activemq:tcp://my.server.com:61616"); 
var connectionFactory = NMSConnectionFactory.CreateConnectionFactory(connecturi); 

Поскольку я не могу изменить уровень безопасности своей сборки (песочница мешает этому), есть ли способ заставить NMS работать как "критически безопасный", чтобы его можно было назвать "прозрачным для безопасности" кодом? Должен ли я перекомпилировать его, чтобы сделать это, или NMS выполняет какую-то операцию, которая никогда не будет считаться "критически безопасной"?

Я ценю любую помощь или предложения...


Assembly 'IntPub, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fa620743b8dc60a' is partially trusted, which causes the CLR to make it entirely security transparent regardless of any transparency annotations in the assembly itself.  In order to access security critical code, this assembly must be fully trusted.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220956</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Unexpected exception from plug-in (Execute): Test.Client: System.MethodAccessException: Attempt by security transparent method 'Test.Client.Execute(System.IServiceProvider)' to access security critical method 'Apache.NMS.ActiveMQ.ConnectionFactory..ctor(System.Uri)' failed.

1 ответ

Из атрибутов сообщения об ошибке похоже, что вы запускаете плагин Dynamics CRM 2011 в режиме "песочницы", в котором есть некоторые очень конкретные правила относительно того, что вы можете и не можете делать. В частности, вам разрешено устанавливать сетевые подключения только через HTTP и HTTPS, поэтому попытка использования необработанных сокетов TCP определенно потерпит неудачу.

Взгляните на эту страницу MSDN, посвященную изоляции плагинов, доверительным отношениям и статистике. Похоже, что может быть способ ослабить сетевые ограничения, изменив запись системного реестра, включив tcp и т. Д. В значение регулярного выражения. Ниже приведен отрывок со страницы. Примечание: я сам этого не делал, поэтому не могу точно сказать, что это сработает.

Подключаемые модули для изолированной среды и настраиваемые рабочие процессы могут получать доступ к сети через протоколы HTTP и HTTPS. Эта возможность обеспечивает доступ к популярным веб-ресурсам, таким как социальные сайты, новостные ленты, веб-сервисы и т. Д. Следующие ограничения веб-доступа применяются к этой возможности песочницы.

  • Разрешены только протоколы HTTP и HTTPS.
  • Доступ к localhost (loopback) не разрешен.
  • IP-адреса не могут быть использованы. Вы должны использовать именованный веб-адрес, который требует разрешения имен DNS.
  • Анонимная аутентификация поддерживается и рекомендуется. Не предусмотрено запрашивать вошедшего в систему пользователя учетные данные или сохранять эти учетные данные.

Эти ограничения веб-доступа по умолчанию определены в разделе реестра на сервере, на котором выполняется процесс Microsoft.Crm.Sandbox.HostService.exe. Значение раздела реестра может быть изменено системным администратором в соответствии с требованиями бизнеса и безопасности. Путь к разделу реестра на сервере:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSCRM \ SandboxWorkerOutboundUriPattern

Значение ключа - это строка регулярного выражения, которая определяет ограничения веб-доступа. Значение ключа по умолчанию:

"^ http [s]?: // (?! ((localhost [: /]) | ([.]) | ([0-9] + [: /]) | (0x [0-9a-f] + [: /]) | (. ((([0-9]+)|(0x[0-9A-F]+))){3}(([0-9]+)|(0x[0-9а-F]+))[:. /]))) +";*

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

Другие вопросы по тегам