Question

J'ai actuellement utilisé MAF pour créer un complément modèle où les compléments sont chargés dans un AppDomain (autorisation Internet) restreint. Cela signifie que le complément ne peut pas appeler notre base de données qui est ce que nous voulons dans la plupart des cas que nous voulons éviter que les auteurs complément en cours d'exécution toutes les requêtes directement contre le db.

Nous les voulons utiliser une certaine forme d'API hôte qui leur permettra d'effectuer certaines tâches (par exemple exécuter des requêtes très spécifiques ou envoyer des emails). Quelqu'un peut-il me dire la meilleure façon de le faire?

J'ai essayé de configurer le AppDomain pour traiter l'ensemble qui contient l'API hôte en tant qu'ensemble pleine confiance tout en exécutant les compléments d'une manière limitée, mais je reçois toujours SecurityExceptions lorsque je tente d'ouvrir une connexion db.

Était-ce utile?

La solution

OK, je l'ai réussi à résoudre ce problème. Pour les personnes qui ont besoin de savoir:

  1. Créer un assemblage avec l'API hôte dans et permettre le complément de le référencer.
  2. Assurez-vous de l'ensemble qui contient l'API hôte a l'attribut [de AllowPartiallyTrustedCallers] sur au niveau de l'assemblage et le nom fort de l'ensemble.
  3. Assurez-vous de l'API hôte est enregistré avec le AppDomain en tant qu'ensemble confiance assemblage complet (voir http://blogs.msdn.com/b/shawnfa/archive/2005/08/08/449050.aspx sur la façon de le faire).
  4. Vérifiez que les méthodes de l'API hôte qui requièrent des autorisations sont décorées avec une escalade [SecuritySafeCritical] attribut (.NET 4).
  5. Demande pleine confiance au début de chaque méthode que vous avez besoin d'autorisations et escalade supprimer la demande immédiatement après. Le code ci-dessous fournit une méthode qui prend un délégué qui sera exécuté en pleine confiance.

    /// <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;
    
    }

En outre, avant le chargement des compléments assurez-vous que l'API hôte est chargé dans le AppDomain restreint. Cela va éviter des exceptions où l'ensemble API hôte ne peut pas être trouvé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top