Tenter par la sécurité transparente la méthode X à la sécurité de l'accès méthode critique Y échoué
J'ai un assez stable server version de l'application qui a été déployé depuis près d'un an à des dizaines de clients.
Un nouveau client récemment, le programme d'installation de l'application et d'obtenir l'erreur suivante:
Système.MethodAccessException: Tenter de sécurité transparent
[SomeMethod] pour accéder à la sécurité de la méthode critique [SomeOtherMethod]
a échoué.
Les deux SomeMethod et SomeOtherMethod sont des méthodes dans les assemblées que j'ai écrit, qui sont construites contre .NET 4, et qui sont en cours d'exécution à l'intérieur d'un Service Windows. Si cela fait une différence, SomeOtherMethod fait référence à un type à partir d'un 3ème partie de l'assemblée (EntLib 4.1) construit contre la .NET 2.0. En regardant le code pour EntLib 4.1, je ne vois qu'ils utilisent les deux SecurityTransparent et APTC attributs, mais cela n'a jamais causé de problèmes à d'autres clients.
Ces assemblées ont été mis à niveau à partir de la .NET CLR 2.0, mais il y a longtemps. Ce code exact est en cours d'exécution sur d'autres clients tout bien, et je ne suis pas explicitement à l'aide de l'APTC attribut et je ne suis pas à l'aide de la SecurityCritical attribut n'importe où.
Cela m'amène à la conclusion que c'est un problème de configuration ou peut-être .NET Framework patch question. Il y a eu un patch publié pour .NET qui serait la cause de cette modification de rupture? Est-il un paramètre de configuration de certains où les qui impose ce type de contrôle qui est désactivée par défaut, mais que mon client peut-être permis?
Un dernier point. Mon service utilise SSRS RDLCs pour générer des fichiers Pdf. En raison de certains changements dans .NET 4, je dois forcer le service pour utiliser l'héritage politique de sécurité via la configuration suivante:
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true" />
</runtime>
Pour plus de détails sur pourquoi j'ai besoin de faire cela, voir ce stackoverflow post: Très Forte Utilisation de la Mémoire dans .NET 4.0
Le point important est que je le fais à tous mes autres clients. Uniquement ce client est d'avoir des problèmes.
Vous devez vous connecter pour publier un commentaire.
Soupir, les habitudes et les pratiques mises en œuvre par Microsoft des Modèles Et des Pratiques de l'équipe qui est responsable pour les bibliothèques d'Entreprise sont assez déplorable. Eh bien, l'exception est exact, vous ne pouvez pas appeler une méthode qui est décoré comme "je vais certainement vérifier la sécurité" de code qui est décoré avec des "Meh, je ne vais pas vérifier la sécurité afin de ne pas la peine de brûler les cycles cpu pour le vérifier". Qui pèse sur d'exception spécifications Java. CAS est incroyablement utile, mais le diagnostic des exceptions est l'un des principaux maux de tête et implique souvent un code qui ne vous appartient pas et ne peut pas réparer. Des grandes raisons pour lesquelles il a obtenu obsolète dans .NET 4.
Éditorial fait. Prendre un pot-shot sur le problème, vous devez trouver pourquoi TAS est appliquée ici. L'explication la plus simple pour cela est que le service n'est pas exécutée en pleine confiance. L'explication la plus simple pour que est que le client n'a pas d'installer le service sur le disque dur local. Ou est généralement exécution de code dans don't trust-il le mode même sur les assemblées locales, un très paranoïaque admin pourrait bien préférer que. Qui a besoin d'être configuré avec Caspol.exe un outil dont les options de ligne de commande sont aussi mystérieux que le TAS. Pot-de tir à la non-confiance emplacement explication, votre client doit exécuter Caspol comme indiqué dans ce post de blog. Ou tout simplement de déployer le service local de sorte que la valeur par défaut "j'ai confiance en toi" s'applique.
De l'édition dans la véritable raison découvert par l'OP: méfiez-vous de la flux de données qui est ajouté à un fichier lorsqu'il est téléchargé à partir d'un Internet non ou un emplacement réseau. Le fichier sera un ruisseau nommé "Zone de.Identificateur" qui conserve la trace de l'endroit où il est venu de avec la "ZoneId" de la valeur. C'est cette valeur qui remplace la fiducie provenant de l'emplacement de stockage. Habituellement, le mettre dans la zone Internet. Utilisez l'Explorateur, cliquez-droit sur le fichier et cliquez sur "Débloquer" pour supprimer le flux. Après vous êtes sûr que vous pouvez faire confiance le fichier 🙂
Dans le cas où il aide les autres, je poste ma solution pour ce problème:
1) Sur la AssemblyInfo.cs, supprimé/a commenté le [assembly: SecurityTransparent] ligne.
2) La Classe et de la Méthode qui fait le Travail réel a été marqué comme
[SecuritySafeCritical]
, dans mon cas, d'établir une Connexion Réseau:3) L'Appelant de la Classe et de la Méthode a marché [SecurityCritical]:
J'ai été confronté au même problème lors de l'exécution de la téléchargé WCF échantillon de http://www.idesign.net/ tout en utilisant leurs ServiceModelEx de la bibliothèque.
J'ai commenté la ligne ci-dessous dans AssemblyInfo.cs dans ServiceModelEx projet
et il a travaillé pour moi.
Dans mon cas c'était un problème lorsque j'ai réussi a les packages NuGet dans la solution d'un paquet remplace Système.Web.Mvc assemblée de liaison de version dans le site web principal du projet. Retour à 4.0.0.0 (j'ai eu 5.0 est installé). Je n'ai pas d'avis de changement le changement, car Mvc v4.0 a été installé et accessible par l'intermédiaire du GAC. Set back