Как добавлять доступов в ограничении Appdomains Access Essalated Services

StackOverflow https://stackoverflow.com/questions/4148471

  •  30-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

  1. Создайте сборку с помощью Host API в нем и разрешите дополнением к его ссылке.
  2. Убедитесь, что сборка, которая содержит API хоста, имеет атрибут [RUBLEPARTILATETRUSTEDCALLERS] на уровне сборки и сильное имя узла.
  3. Убедитесь, что сборка API хоста зарегистрирована в AppDomain в качестве полного доверительного узла (см. http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx. о том, как это сделать).
  4. Убедитесь, что методы на API хоста, требующие эскалации разрешений, украшены SecuritySafecritic атрибут (.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();
    
    
    
    T result = func();
    
    
    //Undo the grant for full-trust!
    CodeAccessPermission.RevertAssert();
    
    
    return result;
    
    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top