J’ai un complément Internet Explorer, écrit en C #, qui communique via un canal nommé WCF vers une application de bureau .NET. L’application de bureau crée l’hôte de service pour netNamedPipeBinding et chaque instance du complément IE crée une ChannelFactory pour communiquer avec l’application. Tout fonctionne bien sous Windows XP, mais une exception est levée sous le mode protégé d’IE dans Windows 7.
System.ServiceModel.CommunicationException: Impossible de se connecter au noeud final “net.pipe: //localhost/MyApp.MyID”. —> System.IO.PipeException: il existe un noeud final de canal pour ‘\. \ Pipe … guid …’, mais la connexion a échoué: l’access est refusé. (5, 0x5)
L’exécution du complément en mode protégé est un scénario que je dois prendre en charge. D’après ce que je comprends, si j’abaisse le niveau d’intégrité du canal nommé, mon complément IE sera autorisé à en parler. Ma question est de savoir comment faire cela. J’ai la configuration requirejse pour utiliser WCF, et préférerais que cela rest ainsi. Puis-je faire en sorte que WCF crée le canal nommé avec le niveau d’intégrité inférieur? Quel code est-ce que j’écris pour que cela se produise?
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é fourni lors de la création du canal nommé. Dans la norme NetNamedPipeBinding, cet appel à CreateNamedPipe
dans la CreatePipe()
privée CreatePipe()
de la classe WCF interne System.ServiceModel.Channels.PipeConnectionListener
. Je ne vois pas de moyen de changer la façon dont il spécifie le descripteur de sécurité initial pour le canal.
Voir cette question et réponse pour un aperçu de ce que nous devons réaliser.
Écrire à partir de zéro un élément de liaison de transport de canaux nommé personnalisé semble être le seul moyen à l’heure actuelle de résoudre ce problème. Dans le cas contraire, nous devrons attendre que Microsoft ajoute des fonctionnalités d’activation dans une future version de WCF. Si vous avez access à Microsoft Connect, vous pouvez append votre voix aux autres utilisateurs qui demandent cette fonctionnalité .
EDIT: J’étais trop pessimiste. J’ai maintenant trouvé un moyen de le faire.
La clé était qu’il ne s’avérait pas nécessaire de spécifier l’étiquette d’intégrité dans le descripteur de sécurité lors de la création du canal. Toutefois, vous devez modifier la liste SACL à l’aide du descripteur renvoyé par CreateNamedPipe à l’ouverture du programme d’écoute. toute première poignée côté serveur au tuyau. Si vous utilisez un autre CreateNamedPipe
, la tentative d’ajout de l’étiquette d’intégrité échoue toujours, car le paramètre indicateur CreateNamedPipe
de CreateNamedPipe
surcharge l’utilisation de l’un des bits pour signifier à la fois FILE_FLAG_FIRST_PIPE_INSTANCE
et WRITE_OWNER
. Nous avons besoin de la dernière autorisation d’access pour append l’étiquette d’intégrité, mais la présence de la première entraîne l’échec de l’appel sur toutes les occurrences sauf la première instance de canal.
Mettre la main sur le premier tuyau n’est pas une mince affaire. WCF le contourne 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 (ce qui peut être saisi directement en redéfinissant la méthode BuildChannelListener<>
d’un élément de liaison), et il est beaucoup plus difficile d’y accéder. Cela implique l’utilisation de la reflection par héroïque pour localiser le gestionnaire de transport pour le noeud final, qui contient une référence à l’écouteur de connexion du noeud final, puis pour descendre une chaîne d’écouteurs de connexion (qui varie en fonction de la configuration du traçage, etc.) jusqu’à ce que le listener de connexion par canal soit trouvé. . Si nous avons de la chance, le premier descripteur de canal peut alors être trouvé dans la liste d’acceptation en attente de l’auditeur (bien qu’il existe une condition de concurrence critique: si un client se connecte avant que nous ayons obtenu le descripteur, celui-ci disparaîtra pour toujours).
Une fois que le descripteur est disponible, réduire l’intégrité pour permettre aux clients à faible intégrité de communiquer avec le service consiste simplement à appeler SetSecurityInfo
sur le SetSecurityInfo
pour append l’étiquette d’intégrité.
J’ai l’intention de couvrir ceci est quelques détails sur mon blog bientôt.