48 votes

Règles de sécurité d'héritage violées lors du remplacement d'un membre - SecurityRuleSet.Level2

J'ai une classe qui hérite de l'Exception. Dans .NET 4, j'ai commencé à recevoir une erreur d'exécution:

L'héritage des règles de sécurité violé tout en substituant membre: MyBusinessException.GetObjectData(Système D'.Moment de l'exécution.La sérialisation.SerializationInfo, Système.Moment de l'exécution.La sérialisation.StreamingContext)'. Sécurité l'accessibilité de la méthode de remplacement doit correspondre à la sécurité de l'accessibilité de la méthode surchargée.

Je pense que le problème est causé par le fait que je suis primordial GetObjectData.

Je sais que la réponse à la résolution du problème consiste à définir la SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Ce n'est pas une réponse acceptable, je voudrais savoir comment résoudre le problème sans avoir à se détendre par défaut des règles de sécurité .NET 4.

36voto

Julien Lebosquain Points 20894

Mark GetObjectData avec SecurityCriticalAttribute, car il est appliqué Exception.GetObjectData. Un substituée membre devrait avoir la même sécurité de l'accessibilité (Critique, Coffre-fort Critique ou Transparent).

Lire des Modifications de Sécurité dans le .NET Framework 4 et de Sécurité du Code Transparent, Niveau 2 à partir de MSDN pour plus d'informations.

Pour éviter tous les potentiels de la sécurité des exceptions d'exécution, de permettre l'Analyse de Code avec la Sécurité de l'ensemble de règles. Vous obtiendrez d'analyse statique des avertissements qui peuvent correspondre à des erreurs d'exécution.

22voto

Vedran Points 2107

Avait ce problème quand j'appelais un assembly qui avait l'attribut AllowPartiallyTrustedCallers:

 [assembly: System.Security.AllowPartiallyTrustedCallers]
 

Le supprimer a résolu mon problème sans passer à SecurityRuleSet.Level1.

13voto

Joe Enzminger Points 2532

Concernant cette erreur dans les environnements d'hébergement partagés qui permettent complète des applications de confiance. Lorsque vous bin déployer une application, vous avez souvent écraser web.config. Sous IIS, lorsque vous modifiez les paramètres de confiance à quelque chose de différent que celui par défaut, votre site web section de configuration est modifié avec:

<system.web>
    <trust level="Full" />
<system.web>

La copie d'un nouveau site web.config cours de déploiement souvent remplace ce paramètre, cependant IIS Admin continue à afficher le site comme "Pleine Confiance", alors qu'en réalité, le site est en cours d'exécution dans quel que soit le niveau de confiance par défaut est pour votre partagée fournisseur d'hébergement (généralement moyennes).

Vous verrez cette erreur et faire ce que j'ai fait, essayez de comprendre pourquoi vous voyez, même si vous savez que le site est en cours d'exécution sous une confiance totale, alors qu'en réalité, il ne l'est pas. La solution est soit de modifier votre site web config comme indiqué ci-dessus avant le déploiement ou l'utilisation IIS Admin pour mettre le site à un autre niveau de fiabilité (élevée, par exemple), appliquer, puis le mettre de revenir à la version complète. Faire réinsère le nécessaire fichier de config de l'information et de redémarrage de l'application de la piscine en pleine confiance.

2voto

Charlie Kilian Points 3469

Pour moi, le problème était avec le log4net de la bibliothèque. J'ai téléchargé la source, et ajouté le fichier de projet dans ma solution pour que je puisse l'étape dans les bibliothèques externes. Cependant, log4net besoin de l' NET_4_0 symbole défini pour la compilation conditionnelle. Par défaut, il avait NET_1_0 défini. Je suis allé dans le log4net les propriétés du projet et changé NET_1_0 de NET_4_0, et le problème est résolu.

Aparté: peut-être que je ne suis pas en suivant les meilleures pratiques, y compris les bibliothèques dans mon projet. Si c'est le cas, j'aimerais avoir des commentaires sur les différentes façons de le faire, et les avantages et les inconvénients de chaque choix. Ma pensée est que si il ya une erreur, d'être en mesure de voir à la bibliothèque de la source de m'aider à comprendre ce que la bibliothèque s'attend, qui va m'aider à effacer l'erreur. Aussi, de voir comment d'autres personnes à écrire le code source n'est rien si ce n'est une expérience d'apprentissage précieuse. En gros, je suis en train de suivre les conseils de Jeff Atwood trouvé ici. Mais si il ya une meilleure façon pour ce faire, je suis tout ouïe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X