2010-10-31 15 views
5

J'ai un complément Internet Explorer, écrit en C#, qui parle via un WCF named-pipe à une application de bureau .NET. L'application de bureau crée le ServiceHost pour netNamedPipeBinding et chaque instance du complément IE crée une ChannelFactory pour communiquer avec l'application. Tout fonctionne correctement sous Windows XP, mais une exception est levée sous le mode protégé d'IE dans Windows 7.Comment faire pour réduire l'intégrité du tuyau nommé WCF

System.ServiceModel.CommunicationException: Impossible de se connecter à l'extrémité 'net.pipe: //localhost/MyApp.MyID'. ---> System.IO.PipeException: Un point de terminaison de canal existe pour '\. \ Pipe ... guid ...', mais la connexion a échoué: l'accès est refusé. (5, 0x5)

L'exécution du complément en mode protégé est un scénario que je dois prendre en charge. Ma compréhension est que si je baisse le niveau d'intégrité de la pipe nommée, alors mon complément IE sera autorisé à parler à travers elle. Ma question est de savoir comment faire cela. J'ai des choses configurées pour utiliser la WCF, et préfèrerais de préférence le garder comme ça. Puis-je faire en sorte que WCF crée le canal nommé avec le niveau d'intégrité le plus bas? Quel code puis-je écrire pour que cela se produise?

Répondre

7

Je ne pense pas que ce soit possible.

Le problème est que l'étiquette d'intégrité doit être spécifiée dans le descripteur de sécurité fourni lorsque le canal nommé est créé. Dans le NetNamedPipeBinding standard, cet appel à CreateNamedPipe se produit dans la méthode privée CreatePipe() de la classe WCF interne System.ServiceModel.Channels.PipeConnectionListener. Je ne vois pas comment modifier le descripteur de sécurité initial du tube.

Voir this question and answer pour un aperçu de ce que nous devons réaliser. L'écriture d'un élément de liaison de transport de canal nommé personnalisé semble être le seul moyen actuellement de contourner ce problème, faute de quoi nous devrons attendre que Microsoft ajoute des fonctionnalités d'activation dans une future version de WCF. Si vous avez accès à Microsoft Connect, vous pouvez add your voice to the others requesting this feature.

EDIT: J'étais trop pessimiste. J'ai maintenant trouvé un moyen de le faire. La clé est qu'il s'est avéré que vous n'avez pas nécessairement à spécifier l'étiquette d'intégrité dans le descripteur de sécurité lorsque le canal est créé - mais vous devez modifier la liste SACL en utilisant le handle renvoyé par CreateNamedPipe lorsque l'écouteur est ouvert - c'est-à-dire la toute première poignée côté serveur vers le tuyau. À l'aide de n'importe quel autre handle, la tentative d'ajout du label d'intégrité échoue toujours, car le paramètre dwOpenMode flag à CreateNamedPipe surcharge l'utilisation de l'un des bits pour signifier FILE_FLAG_FIRST_PIPE_INSTANCE et WRITE_OWNER. Nous avons besoin de cette dernière autorisation d'accès pour ajouter l'étiquette d'intégrité, mais la présence de cette dernière provoque l'échec de l'appel sur n'importe quelle instance, à l'exception de la première instance de canal.

La mise en place de la première poignée de conduite n'est pas une mince affaire. WCF l'écarte dans une instance du type System.ServiceModel.Channels.PipeConnectionListener.PendingAccept, stockée dans une liste gérée par l'écouteur de connexion de canal. L'écouteur de connexion n'est pas la même chose que l'écouteur de canal (qui peut être saisi directement en remplaçant la méthode BuildChannelListener<> d'un élément de liaison), et il est beaucoup plus difficile de l'obtenir. Il implique heroic utilisant la réflexion, pour localiser le TransportManager pour le point de terminaison, qui contient une référence à l'écouteur de connexion du point de terminaison, puis une chaîne d'auditeurs de connexion (qui varie selon la configuration de traçage etc.) . Si nous sommes chanceux, le premier handle de pipe peut alors être trouvé dans la liste d'attente en attente de l'auditeur (bien qu'il y ait une condition de concurrence ici - si un client se connecte avant que nous obtenions le handle, il sera parti pour toujours).Une fois que le handle est disponible, abaisser l'intégrité pour permettre aux clients à faible intégrité de communiquer avec le service consiste simplement à appeler le SetSecurityInfo sur la poignée pour ajouter l'étiquette d'intégrité.

Je prévois de couvrir cela est quelques détails sur my blog bientôt.