Question

J'ai un Internet Explorer add-in, écrit en C #, qui parle par l'intermédiaire d'un WCF-tube nommé à une application de bureau .NET. L'application de bureau crée le ServiceHost pour le NetNamedPipeBinding, et ajouter dans chaque instance de l'IE crée un ChannelFactory pour parler à l'application. Tout fonctionne très bien sous Windows XP, mais une exception est levée en mode protégé de IE dans Windows 7.

System.ServiceModel.CommunicationException: Impossible de se connecter au point final 'net.pipe: //localhost/MyApp.MyID'. ---> System.IO.PipeException: Un point de terminaison de tuyau 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 soutenir. Je crois comprendre que si je baisse le niveau d'intégrité de la named pipe, puis ajouter dans mon IE sera autorisé à parler à travers elle. Ma question est de savoir comment faire. J'ai installé des choses à utiliser WCF, et je tiens à garder de préférence cette façon. Puis-je faire WCF créer le canal nommé avec le niveau d'intégrité plus faible? Quel code dois-je écrire pour y arriver?

Était-ce utile?

La solution

Je ne pense pas que cela va être possible.

Le problème est que l'étiquette d'intégrité doit être spécifiée dans le descripteur de sécurité prévu lorsque le canal nommé est créé. Dans le NetNamedPipeBinding standard, cet appel à CreateNamedPipe se passe dans la méthode CreatePipe() privée du System.ServiceModel.Channels.PipeConnectionListener de classe WCF interne. Je ne vois pas un moyen de changer la façon dont il spécifie le descripteur de sécurité initiale pour le tuyau.

Voir cette question et répondre pour un aperçu de ce que nous devons réaliser.

L'écriture d'un élément de liaison de transport tube nommé personnalisé à partir de zéro semble que la seule façon à l'heure actuelle pour contourner cela, faute de quoi nous allons juste attendre pour Microsoft d'ajouter quelques fonctionnalités permettant dans une version future de la WCF. Si vous avez accès à Microsoft Connect, vous pourriez ajoutez votre voix aux autres demandant cette fonctionnalité .

EDIT: J'étais trop pessimiste. Je l'ai maintenant trouvé une façon de le faire.

La clé était qu'il est avéré que vous ne devez pas nécessairement indiquer l'étiquette d'intégrité dans le descripteur de sécurité lorsque la conduite est créée - mais vous ne devez modifier le SACL en utilisant la poignée de retour de CreateNamedPipe lorsque l'auditeur est ouvert - à savoir la première poignée côté serveur vers le tuyau. L'utilisation d'une autre poignée, la tentative d'ajouter l'étiquette d'intégrité échoue toujours, car le paramètre de drapeau dwOpenMode à CreateNamedPipe surchargent l'utilisation de l'un des bits pour signifier à la fois FILE_FLAG_FIRST_PIPE_INSTANCE et WRITE_OWNER. Nous avons besoin de ce dernier l'autorisation d'accès afin d'ajouter l'étiquette d'intégrité, mais la présence des anciennes causes de l'appel à échouer sur tout, mais la première instance de conduite.

Mettre la main sur la première poignée de conduite n'est pas une mince affaire. WCF il écureuils dans une instance de la System.ServiceModel.Channels.PipeConnectionListener.PendingAccept de type, mémorisées dans une liste maintenue par l'auditeur de raccordement de tuyau. L'auditeur de connexion n'est pas la même chose que l'auditeur de canal (qui peut être saisi en remplaçant la carrément méthode BuildChannelListener<> d'un élément de liaison), et il est beaucoup plus difficile à obtenir à. Elle implique heroics utilisant la réflexion, pour localiser le TransportManager pour le noeud final, qui contient une référence à l'auditeur de connexion du point d'extrémité, et ensuite travailler en bas d'une chaîne d'auditeurs de connexion (qui varie selon la configuration de traçage, etc.) jusqu'à ce que l'auditeur de raccordement de tuyau se trouve . Si nous sommes chanceux la première poignée de tuyau peut être trouvée dans l'attente d'accepter la liste de l'auditeur. (Bien qu'il y ait une condition de course ici - si un client se connecte avant que nous mettre la main sur la poignée, il sera parti pour toujours)

Une fois que la poignée est disponible, ce qui réduit l'intégrité pour permettre aux clients de faible intégrité de communiquer wth le service est juste une question d'appeler SetSecurityInfo sur la poignée pour ajouter l'étiquette d'intégrité.

Je prévois de couvrir ce détail est sur mon blog bientôt.

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