Как надстройки в ограниченных доменах приложений должны обращаться к расширенным службам - PullRequest
1 голос
/ 10 ноября 2010

В настоящее время я использовал MAF для создания модели надстроек, в которой надстройки загружаются в ограниченный домен приложений (разрешение Интернет).Это означает, что надстройка не может вызвать нашу базу данных, что в большинстве случаев нам и нужно, поскольку мы хотим, чтобы авторы надстроек не выполняли какие-либо запросы непосредственно к базе данных.

Мы хотим, чтобы они использовали некоторыеформа API хоста, которая позволит им выполнять определенные задачи (например, выполнять очень конкретные запросы или отправлять электронные письма).Может кто-нибудь сказать мне лучший способ сделать это?

Я пытался настроить AppDomain для обработки сборки, содержащей API хоста, как сборки с полным доверием при выполнении надстроек ограниченным способом,однако, я все еще получаю SecurityException, когда я пытаюсь открыть соединение с БД.

1 Ответ

1 голос
/ 11 ноября 2010

ОК, мне удалось решить это.Для людей, которым необходимо знать:

  1. Создайте сборку с Host API в ней и разрешите надстройке ссылаться на нее.
  2. Убедитесь, что сборка, содержащая Host API, имеетатрибут [AllowPartiallyTrustedCallers] на уровне сборки и строгое имя сборки.
  3. Убедитесь, что сборка Host API зарегистрирована в AppDomain как сборка с полным доверием (см. http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx о том, как это сделать.).
  4. Убедитесь, что методы API-интерфейса хоста, которым требуются расширенные разрешения, имеют атрибут [SecuritySafeCritical] (.NET 4).
  5. Требование заполненоДоверьтесь при запуске каждого метода, вам нужны расширенные разрешения, а затем сразу же устраните требование.Приведенный ниже код предоставляет метод, который принимает делегата, который будет работать с полным доверием.

    /// <summary>
    /// Runs the supplied delegate using full trust
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="func"></param>
    /// <returns></returns>
    private static T RunWithFullTrust<T>(Func<T> func)
    {
        //NOTE: This line grants the method full trust
        new PermissionSet(PermissionState.Unrestricted).Assert();
    
    
    <pre><code>T result = func();
    
    
    //Undo the grant for full-trust!
    CodeAccessPermission.RevertAssert();
    
    
    return result;
    
    }

Кроме того, перед загрузкой любых надстроек убедитесь, чточто API хоста загружен в ограниченный домен приложений.Это позволит избежать исключений, когда сборка Host API не может быть найдена.

...